2010-11-16 10 views
5

Ich war überrascht, vor kurzem zu erfahren, dass das Standard-Ruhezustandsverhalten ist, alle Felder in einem Objekt zu aktualisieren, wenn nur eine einzige Änderung vorgenommen wird und die Zusammenführung aufgerufen wird.Dynamic-Update mit JPA

Dynamic Update ist das Feld, das Sie einen alternativen Ansatz nur die Aktualisierung der geänderten Feld ...

http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/

ich JPA mit Hibernate bin mit konfigurieren können, und ich versuchte, die folgende

hinzufügen
@javax.persistence.Entity 
@org.hibernate.annotations.Entity(dynamicInsert=true, dynamicUpdate=true) 

meiner Klasse (bisher nur er hatte die JPA-Annotation)

Wie dem auch sei, ich habe die Überwachung der sQL und es hat sich leider nicht geändert und ich sehe immer noch jedes Feld aktualisiert.

Dies ist mein Java, die das Objekt aktualisiert ...

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)  
public void setAccountStatusForUser(String username, AccountStatus act){ 
    User u = this.getUser(username); 
    u.setAccountStatus(act); 
    this.update(u); 
} 

und die Update-Methode führt Folgendes aus:

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
    public Object update(Object o) { 
     Object a = this.entityManager.merge(o); 
     this.entityManager.flush(); 
     return a; 
} 

Jede Hilfe wäre sehr dankbar.

+1

Ist Ihnen klar, dass der Aufruf zum Update völlig unnötig ist? Hibernate behält Änderungen an angehängten Entitäten am Ende der Transaktion automatisch bei. –

+0

Hey, hast du das jemals gelöst?Ich habe das gleiche Problem –

Antwort

0

einige Fragen, um Ihnen zu helfen:

  • Wie funktioniert Ihr getUser() Methode?
  • Verwenden Sie keine abgelösten Objekte?
  • Wird der zugehörige Datensatz tatsächlich vollständig aus der Datenbank geladen?

Freistehendes Objekte sind nicht mit einer Original-Version, so dass der Ursprung des Wortes abgelöst verknüpft. Dies hilft, den Vergleich zu unterbrechen, wodurch ein vollständiges Upgrade erforderlich wird.

Als ich auf Springsource Forum sah, es funktioniert nur, wenn die Option select-before-update auf true gesetzt ist, die ganz logisch scheint, als Hibernate muss jetzt was tatsächlich geändert. Die select-before-update Option zwingt es, das Original gelesen zu haben.

Wenn Ihre Anwendung die User vollständig aus der Datenbank liest und nicht mit abgesetzter Objekten arbeitet, dann kann ich Ihnen nicht mit mehr Ideen helfen ...

0

Von der Hibernate-Dokumentation:

Be Importieren Sie @ javax.persistence.Entity, um eine Klasse als Entität zu markieren. Es ist ein häufiger Fehler, @ org.hibernate.annotations.Entity versehentlich zu importieren.

+0

Es sieht aus wie das Plakat hatte beide Anmerkungen, so glaube ich nicht, dass Snippet der Dokumente relevant ist. – sdouglass

0

Sie fügen ein losgelöstes Objekt über den Aufruf von merger() wieder an. In diesem Fall müssen Sie selectBeforeUpdate aktivieren. Dies ist in den Javadocs.