Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment puis-je connaître l'identifiant avant d'enregistrer un objet dans jpa

Avec un identifiant de type @GeneratedValue, vous ne pouvez pas connaître cette valeur à l'avance (avant de l'écrire). Cependant, une fois que vous avez conservé votre Bean, le champ id sera rempli dans cette instance de bean et vous pourrez l'obtenir sans avoir à faire une requête supplémentaire pour lui. En d'autres termes :

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();

Aussi, selon la façon dont votre EntityManager est configuré, vous devrez peut-être d'abord valider la transaction (manuellement) avant de pouvoir obtenir cet identifiant.

Mettre à jour selon le commentaire

Si vous souhaitez intercepter et faire quelque chose à l'entité avant qu'elle ne soit enregistrée et/ou mise à jour, vous pouvez utiliser JPA LifeCycle Listeners (si vous utilisez JPA version 2) :gestion des événements de cycle de vie JPA à l'aide d'écouteurs et de rappels.

Fondamentalement, vous pouvez créer un validate() méthode dans votre bean, annotez-la avec @PrePersist et @PreUpdate et effectuez la validation (si le code est vide, définissez-le sur la valeur de l'identifiant)

Mise à jour par 2ème commentaire

Oui, honnêtement, je viens de penser à cela tout à l'heure :que si l'identifiant est généré automatiquement, il pourrait être rempli APRÈS l'événement de pré-persistance, de sorte que lorsque votre code de pré-persistance est exécuté, vous ne savez toujours pas quel est l'identifiant. (vous remarquerez peut-être aussi que dans l'exemple que vous reliez à l'id n'est PAS généré automatiquement mais défini manuellement). Dans ce cas, vous pouvez ajouter un champ booléen à votre entité (annoté avec @Transient afin qu'il ne soit pas persistant) appelé isCodeEmpty (qui est faux par défaut s'il n'est pas spécifiquement initialisé). Puis dans votre @PrePersist méthode annotée, vous vérifiez si la valeur du champ de code est vide et si c'est le cas, définissez le booléen sur true. Ensuite, vous refactorisez votre setId(...) méthode telle que (en plus de définir le champ id) elle vérifiera ce booléen et, si vrai, définira la valeur du champ code sur celle du champ 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;
 }

}


}