JPA 规范很明确
嵌入对象不能独立于其父对象进行查询、持久化、合并。它们是严格私有(依赖)的对象
您应该谨慎使用,因为它的生命周期受拥有实体实例的生命周期的限制。因此,如果您持久化/合并/删除您拥有的实体实例,则其所有可嵌入实例都将被持久化/合并/删除
假设你做类似的事情
/**
* Let's suppose owning contains SIX embeddables instances
*/
Owning owning = manager.find(Owining.class, owningId);
因此,您只需在视图层修改您的拥有实体并提交您的更改。您通过使用检索您的拥有实体
/**
* Usually your web framework Takes care of binding your submitted data
*/
Owning owning = new Owning();
owning.setProperty(request.getParameter("property"));
然后您可以合并您提交的数据,并且您认为您的可嵌入实例已存储在数据库中。走着瞧
如上所示,您(或您的 Web 框架)刚刚检索到 Owning 属性,对吧???所以你 owning.getElementList()是空的。因为 owning.getElementList() 是空的,所以JPA 将删除它的所有可嵌入实例。请记住这一点。
通常,可嵌入类与其拥有实体没有关系。并且当使用一组可嵌入对象时,JPA总是在保存/更新之前选择,因为它需要使用其 equals 方法逐个比较。因此,在使用 Set 集合时,您需要一致的 equals 实现。
在这里你可以看到它在 Hibernate 中的对应物。