С идентификатор на тип @GeneratedValue не можете да знаете тази стойност предварително (преди всъщност да я напишете). Въпреки това, след като запазите своя Bean, полето id ще бъде попълнено в този екземпляр на bean и можете да го получите, без да е необходимо да правите допълнителна заявка за него. С други думи:
MyEntiry myEnt = new MyEntity(); //the id field is null now
entityManager.persist(myEnt);//the id field is populated in myEnt now
Long id = myEnt.getId();
Също така, в зависимост от това как вашият EntityManager
е конфигуриран, може да се наложи също така първо да извършите транзакцията (ръчно), преди да можете да получите този идентификатор.
Актуализиране според коментар
Ако искате да прихванете и да направите нещо на обекта, преди да бъде запазен и/или актуализиран, можете да използвате JPA LifeCycle Listeners (ако използвате JPA версия 2):Обработка на събитие от жизнения цикъл на JPA с помощта на слушатели и обратни извиквания.
По принцип можете да направите validate()
метод във вашия bean, анотирайте го с @PrePersist
и @PreUpdate
и направете проверката в него (ако кодът е празен, задайте го на стойността на id)
Актуализация на 2-ри коментар
Да, честно казано току-що се сетих за това:че ако идентификаторът е автоматично генериран, той може да се попълни СЛЕД събитието за предварително запазване, така че когато вашият пре-постоянен код се изпълни, все още не знаете какъв е идентификационният номер (може да забележите също, че в примера, който свързвате към идентификатора, НЕ се генерира автоматично, а се задава ръчно). Това, което можете да направите в този случай, е да добавите булев поле към вашия обект (анотирано с @Transient
така че няма да се запази) наречен isCodeEmpty
(което е false по подразбиране, ако не е специално инициализирано). След това във вашия @PrePersist
анотиран метод, вие проверявате дали стойността за полето за код е празна и ако е така, задайте булевата стойност на true. След това преработвате своя setId(...)
метод, така че (освен задаване на полето id) той ще провери това булево и ако е вярно, зададе стойността на полето код на тази на полето id:
public class YourEntity {
@Transient
private boolean isCodeEmpty;
public void setId(Whatever id) {
this.id = id;
if(isCodeEmpty) {
this.code = id;
//if necessary:
//this.isCodeEmpty = false;
}
}
@PrePersist
public void validate() {
if(code == null || code.isEmpty()) {
isCodeEmpty = true;
}
}
}