2017-08-23 59 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

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