wissen, können Sie diesen Wert nicht im Voraus mit einem @GeneratedValue Typ-ID, etwas zu tun (bevor es tatsächlich zu schreiben). Sobald Sie jedoch Ihr Bean beibehalten, wird das ID-Feld in dieser Bean-Instanz gefüllt und Sie können es erhalten, ohne eine zusätzliche Abfrage dafür durchführen zu müssen. Mit anderen Worten:
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();
Auch je nachdem, wie Ihre EntityManager
konfiguriert ist, müssen Sie möglicherweise auch zuerst die Transaktion (manuell) begehen, bevor Sie diese ID bekommen.
-Update per Kommentar
Wenn Sie etwas an die Einheit abzufangen und zu tun, bevor es gespeichert wird und/oder aktualisiert werden, können Sie JPA LifeCycle Hörer verwenden (wenn Sie JPA Version 2 verwenden): Handling JPA lifecycle event using listeners and callbacks .
Grundsätzlich können Sie eine validate()
Methode in Ihrem Bean machen, mit Anmerkungen versehen es mit @PrePersist
und @PreUpdate
und die Validierung in es tun (wenn Code es leere Menge ist zu ids Wert)
Update per 2. Kommentar
Ja, ich habe ehrlich gesagt gerade jetzt daran gedacht: Wenn die ID automatisch generiert wird, könnte sie nach dem Pre-Persist-Ereignis gefüllt werden, so dass Sie, wenn Ihr Pre-Persist-Code ausgeführt wird, immer noch nicht wissen, was die ID ist (Sie werden vielleicht auch bemerken, dass in dem Beispiel, das Sie mit der ID verknüpfen, NICHT automatisch generiert wird, sondern manuell gesetzt wird). Was Sie in diesem Fall tun können, ist ein boolesches Feld zu Ihrer Entität hinzuzufügen (mit @Transient
gekennzeichnet, so dass es nicht persistent bleibt) isCodeEmpty
(das ist falsch, wenn nicht speziell initialisiert). Dann prüfen Sie in Ihrer annotierten Methode @PrePersist
, ob der Wert für das Codefeld leer ist und wenn ja, setzen Sie den Boolean auf True. Dann Refactoring Sie Ihre setId(...)
Methode, so dass (abgesehen von dem ID-Feld Einstellung) wird es diese boolean überprüfen, und wenn sie wahr Satz des Wert des Codefeldes zu der dem ID-Feld:
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;
}
}
}
Sie konnten die @GeneratedValue vermeiden, verwenden Sie den Generator selbst den Wert zu erhalten und es zu Einheit auf „manuell“ – SJuan76
ich nicht Ich möchte es manuell auf entity setzen. Wenn ich den nächsten Wert für id von oracle bekomme und es auf die ID der neuen Entity setze, ist das rational? – mstzn