С идентификатор на тип @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;
}
}
}