Как реализовать поле автоматического увеличения, отличное от поля id?

#java #sql #sql-server #hibernate #jpa

#java #sql #sql-сервер #спящий режим #jpa

Вопрос:

Я хочу реализовать одно поле автоматического увеличения, отличное от поля id, которое начинается с 1 и последовательно увеличивается на 1.

Пример кода :

 @Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id; //Id primary key

@Column(name = "request_number", nullable = false, unique = true, updatable = false, insertable = false)
@GeneratedValue(generator = "sequence", strategy = GenerationType.AUTO)
private Long requestNumber; //Talking about this
  

Итак, здесь requestNumber должно увеличиваться автоматически каждый раз, когда когда-либо создается объект. И это должно увеличиваться последовательно.

Пример: Первая запись requestNumber будет начинаться с 1 , а следующая requestNumber будет присваиваться с 2 и so on...

Я знаю, что это возможно с помощью java-кода, но я ищу JPA, обеспечивающий такую гибкость.

Ответ №1:

@GeneratedValue используется только для простых первичных ключей, согласно javadoc:

Аннотация GeneratedValue может быть применена к свойству первичного ключа или полю объекта или отображенного суперкласса в сочетании с аннотацией Id. Использование аннотации GeneratedValue требуется поддерживать только для простых первичных ключей. Использование аннотации GeneratedValue не поддерживается для производных первичных ключей.

Если вы хотите сделать это в JPA, вы можете определить @PrePersist метод, подобный:

 @PrePersist
void doPrePersist() {
    // Use EntityManager to create a native query
    // read next value from a sequence
    // set the field value
}
  

Другим вариантом было бы определить столбец базы данных как IDENTITY но это позаботится об автоматическом увеличении за пределами JPA, например, поле объекта не будет вставляться, и значение не будет отображаться во время операции сохранения объекта.

Пожалуйста, обратите внимание, что SQL Server и большинство баз данных не гарантируют, что в последовательности не будет пробелов. Когда транзакция, увеличивающая последовательность, откатывается, значение последовательности не равно, поэтому вы можете получить: 1, 2, 4, 5, 6, 10, …

Ответ №2:

Вы должны объявить @SequenceGenerator аннотацию в своем классе (или поле):

 @SequenceGenerator(sequenceName = "MY_DB_SEQUENCE", name = "sequence")
public class MyClass {
    // keep as is
}
  

Обратите внимание, что generator = "sequence" on @GeneratedValue указывает на @SequenceGenerator с name = "sequence"