2017-08-23 168 views
0

我有一個@OneToOne兩個JPA實體之間的關係,下面的例子被簡化了,而不是真正的實體名稱。JPA合併@OneToOne實體關係

@Entity 
public class Stock { 

    @Id 
    private Long id; 

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

} 

而且StockDetail

@Entity 
public class StockDetail { 

    @Id 
    private Long id; 

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

在我的例子,我需要通過ID來搜索股票,然後更新使用merge如股票的細節。

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

在這一點與調試器我可以看到從合併返回detail是更新的JPA實體。但是,當我再次執行以下操作時,我遇到了一個問題。

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

detail現在似乎有實體的老態,我不知道這有什麼錯上述

+0

您是否在兩種操作中使用了另一個entityManager? –

+0

合併之後你提交了更改嗎? – Shirkam

+0

在對細節進行更改後,嘗試僅使用庫存而非詳細對象'em.merge(stock);'。級聯提到股票。 – janith1024

回答

1

這實際上是@NicoVanBelle的組合和@ janith1024意見。

  1. 有兩個entitymanagers,一個用於執行查找的非緩存em和一個用於合併的緩存em。
  2. 一旦我讓非緩存的EM做​​股票合併,它開始工作。
+0

我沒有注意到昨天提到,但是,這是我正在得到的。做好自己的工作! –