2016-11-02 3 views
5

Ich habe eine sehr einfache Einheit, wie:Wie implementiert man einen Rückruf, wenn die Entität persistent ist?

@Entity 
public class entityA { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private Long id; 

    public entityA(){} 

} 

Soweit ich den Wert id verstand nur, wenn das Unternehmen beibehalten wird eingestellt. Ist das richtig?

Da ich den Wert der id an einige Beobachter propagieren möchte, macht dies nur Sinn, nachdem das Element beibehalten wird. Also brauche ich eine Art Callback (etwas wie void onPersit()) in entityA. Die Methode entityA.onPersit() soll automatisch ausgeführt werden, wenn die Entität persistent ist. Wie implementiert man das?

(Wie) kann eine Entität ihren eigenen Status bestimmen. Z.B. Gibt es eine Art von this.isPersisted() oder this.isDetached()?

Antwort

3

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.

1

Option (1): Erweiterung org.hibernate.EmptyInterceptor Klasse wie folgt:

public class MyInterceptor extends EmptyInterceptor { 

    //override postFlush() which eill be called after entity is committed into database 
    public void postFlush(Iterator iterator) { 
     //add your code here 
    } 

    //You can override other required methods like onDelete(), etc.. 

} 

Sie müssen, wie unten die interceptor object auf die Hibernate session einzustellen (Sie das unten stehende Logik in einem gemeinsamen Verfahren zentralisieren müssen, wird anders wie ein Standardcode):

MyInterceptor interceptor = new MyInterceptor(); 
session = HibernateUtil.getSessionFactory().openSession(interceptor); 
interceptor.setSession(session); 

können Sie bei API suchen here

Option (2): Implementierung org.hibernate.event.PostInsertEventListener Schnittstelle

Sie bei API here

+0

Ok danke. Ich werde es mir ansehen. – BerndGit

+0

Ich konnte 'HibernateUtil' nicht importieren. Wie man es in das Projekt einbaut (mit 'Gradle')? – BerndGit

+0

Es sollte von Hibernate JAR sein https://docs.jboss.org/hibernate/orm/4.0/javadocs/org/hibernate/cache/ehcache/internal/util/HibernateUtil.html – developer

Verwandte Themen