2016-10-11 49 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方法。