@OneToOne 实体关系的 JPA 合并

JPA merge of a @OneToOne entity relationship

我在两个 JPA 实体之间有一个 @OneToOne 关系,下面的例子是简化的而不是真实的实体名称。

@Entity
public class Stock {

    @Id
    private Long id;

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

}

和库存详情

@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现在好像是实体的旧状态,不知道上面有什么问题

这实际上是@NicoVanBelle 和@janith1024 评论的组合。

  1. 有两个实体管理器,一个用于执行查找的非缓存 em 和一个用于执行合并的缓存 em。
  2. 一旦我让非缓存 em 对库存进行合并,它就开始工作了。