2016-10-11 50 views
0

如果我有实体来说:Hibernate的CRUD与列表

  1. ENTITY1有清单,ENTITY2;
  2. 实体2具有实体3的列表;
  3. 实体3具有实体4的列表;

当我在数据库中添加新的Entity4时,我的代码中的操作是什么?

  1. 只需为Entity4设置父项并保存Entity4?

为Entity4
  • 设置父和保存Entity4。在 实体3列表中添加实体4并保存实体3。
  • 添加Entity4在ENTITY3的列表,并保存ENTITY3。所有实体都将更新。
  • +0

    到目前为止你做了什么?分享你的代码 – FuSsA

    回答

    0

    这真的取决于由Entity3存的名单是否设置为级联操作,如PERSISTMERGEDELETE

    如果列表配置为级联,那么所有你需要做的是:

    • 设置的Entity4父。
    • Entity4添加到其父项列表并合并修改的父项。

    如果未配置级联,那么你需要做的:

    • 设置的Entity4父。
    • 坚持新创建的实例Entity4
    • Entity4添加到其父项列表并合并修改的父项。

    现在你可能会问,为什么Entity4的母公司必须更新列表并随后在两种情况下合并?

    这是为了确保关联的两侧都正确更新并正确指向彼此。它很有可能考虑到关联的父节点已经加载到持久化上下文中的情况,因此将该子节点添加到数据库不会刷新,并且对于已加载的实体可见,除非刷新它。在这种情况下,最简单的解决方案是始终正确修改双方。

    public class ParentEntity { 
    
        // add child to the parent entity, maintains association 
        public void addChild(ChildEntity child) { 
        if (child.getParent() != null) { 
         child.getParent().removeChild(child); 
        } 
        child.setParent(this); 
        children.add(child); 
        } 
    
        // remove child from parent, disassociates association 
        public void removeChild(ChildEntity child) { 
        if (this.equals(child.getParent())) { 
         child.setParent(null); 
         children.remove(child); 
        } 
        } 
    } 
    

    我经常发现它有助于揭露辅助方法,就像上面我的域模型,使我的代码并不需要与需要维护的关联有关。我也可能会让父实体列表的setter成为私有的,这样只有Hibernate才能使用它,以便强制严格使用addChild/removeChild方法。