2017-08-23 5 views
0

Ich habe eine @OneToOne Beziehung zwischen zwei JPA-Entitäten, das folgende Beispiel ist vereinfacht und nicht die tatsächlichen Entitätsnamen.JPA Zusammenführung einer @ OneToOne Entity-Beziehung

@Entity 
public class Stock { 

    @Id 
    private Long id; 

    @OneToOne(fetch = FetchType.Lazy, mappedBy = "stock", cascade = CascadeType.ALL) 
    private StockDetail detail; 

} 

Und StockDetail

@Entity 
public class StockDetail { 

    @Id 
    private Long id; 

    @OneToOne 
    @JoinColumn(name = "STOCK_ID") 
    private Stock stock; 
} 

In meinem Beispiel brauche ich von ID für Lager suchen und dann die Lager Detail aktualisieren mit merge zB.

Stock stock = em.find(Stock.class, 1L); 
StockDetail detail = stock.getDetail(); 
// Do some updates to detail 
detail = em.merge(detail); 

An diesem Punkt mit dem Debugger ich, dass die zurück detail aus der Zusammenführung sehe die aktualisierte JPA-Entität ist. Allerdings habe ich ein Problem, wenn ich das Folgende nochmal mache.

Stock stock = em.find(Stock.class, 1L); 
StockDetail detail = stock.getDetail(); 

detail jetzt den alten Zustand des Unternehmens zu haben scheint, ich bin nicht sicher, was mit dem oben

+0

Verwenden Sie für beide Operationen einen anderen EntityManager? –

+0

Haben Sie Ihre Änderungen nach der Zusammenführung vorgenommen? – Shirkam

+0

nach Änderungen am Detail versuchen, nur auf Lager nicht Detail Objekt 'em.merge (Lager);'. Kaskadenangabe auf Lager. – janith1024

Antwort

1

Das war falsch ist eigentlich eine Kombination von @NicoVanBelle und @ janith1024 Kommentare.

  1. Es gab zwei EntityManager, ein nicht zwischengespeichertes em für die Suche und ein zwischengespeichertes em für die Zusammenführung.
  2. Sobald ich die nicht-cached em die Zusammenführung auf die Aktie tun, begann es zu arbeiten.
+0

Ich bemerke nicht die Erwähnung gestern, aber ja, das ist, was ich bekam. Gute Arbeit, es alleine zu finden! –

Verwandte Themen