2011-01-03 7 views
3

Ich benutze Spring 3, Hibernate 3.3.1 und MySQL 5.1.x (auf Red Hat 5, siehe auch dasselbe Verhalten unter Windows). Ich bemerke, dass eine Zeile in der Datenbank aktualisiert wird, aber die eine der Objektreferenzen im Speicher wird nicht aktualisiert. Ich werde versuchen, die Klassenstruktur in einer vereinfachten Form zu beschreiben ..Veraltetes Objekt im Speicher (mysql, spring 3, hibernate)

class A { 
    @OneToMany(cascade = CascadeType.ALL) 
    List<Widget> widgets; 

    @OneToMany(cascade = CascadeType.ALL) 
    @Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    List<B> bObjects; 

    @Transactional 
    public void turnOnWidgets() { ... } 
} 

class B { 
    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH }) 
    @Cascade(value = { org.hibernate.annotations.CascadeType.LOCK, org.hibernate.annotations.CascadeType.EVICT}) 
    private A aObj; 

    @Transactional(propagation=Propagation.REQUIRES_NEW) 
    public void turnOnWidgets() { 
    for (Widget w : aObj.getWidgets()) { 
     w.setOn(true); 
    } 
    } 
} 

class Widget { 
    Boolean on; 
} 

Hier ist die Folge von Aktionen. Wenn A.turnOnWidgets aufgerufen wird, durchläuft es seine Auflistung von "bObjects" und ruft "turnOnWidgets" für jedes B-Objekt auf. Das B-Objekt ändert die Eigenschaft "on" für jedes Widget, auf das das A-Objekt verweist (wie oben in B.turnOnWidgets gezeigt).

Wenn dies passiert, kann ich in die Datenbank schauen und sehen, dass der "Ein" -Wert für die Widgets geändert hat. Wenn ich jedoch mit einem Debugger in den Code eintrete, bemerke ich, dass das B-Objekt auf eine andere Instanz von A verweist (zB dasselbe A aus der Datenbank, aber im Speicher eine andere Java-Objektinstanz) als das A, das ich "turnOnWidgets" aufgerufen habe. auf.

Effektiv, was ich sehe, ist, wenn ich durch die Objektgrafik durch die Widgets der A-Instanz zu navigieren, die Widgets "on" Eigenschaft ist falsch. Wenn ich jedoch die Widgets betrachte, indem ich von B.aObj.getWidgets() navigiere, ist ihre Eigenschaft "on" wahr.

Als meine Anwendung gegen eine Oracle-Datenbank lief, funktionierte das alles gut, sobald ich zu MySQL wechselte, fing ich an, dieses Problem zu sehen.

Wer weiß, ob es etwas Besonderes an MySQL (vielleicht in Verbindung mit Hibernate und/oder Spring) gibt?

UPDATE Also ich denke, ich es verengt habe im Code zu einem Abschnitt nach unten, wo ein JPA „aktualisieren“ auf dem „B“ Objekt durchgeführt wird. Wenn dies gegen Oracle ausgeführt wird, werden die Objekte im Arbeitsspeicher ordnungsgemäß aktualisiert. Wenn sie jedoch gegen MySQL ausgeführt werden, werden die Objekte nicht ordnungsgemäß aktualisiert. Ich muss immer noch herausfinden, warum.

Antwort

0

Nicht sicher über Ihr Problem, aber ich denke, man mappedBy müssen, da es für die bidirektionale Beziehungen erforderlich ist:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "aObj") 
@Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
List<B> bObjects; 
+0

Ich habe versucht, dass, keinen Unterschied machen schien. Ich habe bereits die @ JoinColumn darauf. – codecraig