Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да знам идентификатора, преди да запиша обект в jpa

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

}


}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Хибернация Timestamp с часова зона

  2. ORA-08177:не може да сериализира достъпа за тази транзакция

  3. Oracle SQL:Актуализирайте таблица с данни от друга таблица

  4. Как да преминете през разделен списък в Oracle PLSQL

  5. Как да се свържете отдалечено с базата данни Oracle 11g