java - @OneToOne 实体关系的 JPA 合并

标签 java jpa eclipselink

我在两个 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 对 stock 进行合并后,它就开始工作了。

关于java - @OneToOne 实体关系的 JPA 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45834348/

相关文章:

java - JPA - 几分钟后与数据库的连接超时

java - JPA illegalStateException - CascadeType 问题

java - RSA。 Java 加密 .NET 解密

java - Spring Data JPARepository 和@Transactional 用于一个方法内的多个操作

java - 2 个 JPA 实体在同一张表上

java - 检查EntityManagerFactory

java - GC 期间释放了什么?

java - 我如何启动具有另一种外观的 Java 应用程序 (jar)?

java - 如何捕获图像并保存它(Uri)?

java - Eclipse链接JPA - 仅获取关联表记录的实体