#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"