Wenn ich wo man hinschaut, kann ich mit der Lösung gehen würde, die in der JPA-Spezifikation zur Verfügung steht, die @PostPersist
Anmerkung. Ihr Unternehmen würde wie folgt aussehen:
@Entity
public class entityA {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
public entityA(){}
@PostPersist
public void onPersit() {
// logic to perform after the entity has been persisted
}
}
Die Java Persistence 2.1 Specification erklärt die Funktionalität wie folgt aus:
Die PostPersist und Postremove Callback-Methoden für eine Entität aufgerufen werden, nachdem die Entität persistent gemacht oder entfernt wurde. Diese Rückrufe werden auch für alle Entitäten aufgerufen, für die diese Operationen kaskadiert sind. Die Methoden PostPersist und PostRemove werden nach dem Einfügen bzw. Löschen der Datenbank aufgerufen. Diese Datenbankoperationen können direkt nach der Persisten-, Zusammenführungs- oder Entfernungsoperationen ausgeführt werden, oder sie können direkt auftreten, nachdem eine Flush-Operation aufgetreten ist (die sich am Ende der Transaktion befinden kann). Erstellte Primärschlüsselwerte sind in der PostPersist-Methode verfügbar.
Das obige Zitat beantwortet auch Ihre Frage, ob der generierte Primärschlüssel erst nach dem Einfügen in die Datenbank verfügbar ist. Ihre Annahme war richtig, aber sie wird in der Methode @PostPersist
zur Verfügung stehen.
In Bezug auf die Frage nach Methoden, die auf dem Unternehmen, dessen Zustand zu überprüfen, ist die naive Art und Weise, ob das @Id
Feld null
oder nicht, ist zu prüfen. Wenn der Code von dem Buch geschrieben wird (d. H. Das Feld selbst nicht modifiziert), wird dies funktionieren.
Allerdings gibt es eine anspruchsvollere dies zu erreichen, wie in this answer vorgeschlagen:
@Transient
private boolean persisted;
@PostLoad
@PostPersist
public void setPersisted() {
persisted = true;
}
die @PostLoad
und @PostPersist
Rückrufe Durch die Verwendung dieses stellt sicher, dass das Feld persisted
richtig eingestellt ist. Auch hier müssen Sie sicherstellen, dass Sie das Feld nicht außerhalb dieser Methode ändern. Die @Transient
-Annotation stellt sicher, dass das Feld kein Kandidat für die Serialisierung ist und daher nicht persistent ist.
Jede dieser Lösungen könnte für die Wiederverwendung zwischen Entitäten in einer abstrakten Entitätsklasse platziert werden.
Ok danke. Ich werde es mir ansehen. – BerndGit
Ich konnte 'HibernateUtil' nicht importieren. Wie man es in das Projekt einbaut (mit 'Gradle')? – BerndGit
Es sollte von Hibernate JAR sein https://docs.jboss.org/hibernate/orm/4.0/javadocs/org/hibernate/cache/ehcache/internal/util/HibernateUtil.html – developer