@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 评论的组合。
- 有两个实体管理器,一个用于执行查找的非缓存 em 和一个用于执行合并的缓存 em。
- 一旦我让非缓存 em 对库存进行合并,它就开始工作了。
我在两个 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 评论的组合。
- 有两个实体管理器,一个用于执行查找的非缓存 em 和一个用于执行合并的缓存 em。
- 一旦我让非缓存 em 对库存进行合并,它就开始工作了。