2010-02-10 59 views
4

假設我有這2類:如何用Hibernate映射這些類?

class A{ 

    B ref1 = null; //Can both be null 
    B ref2 = null; 

} 

class B{ 

    .. 
} 

我省略了getter和setter REF1和REF2。當然,我想添加id ...無論如何,我想要的是讓hibernate處理這兩個引用的自動持久性...並自動刪除B對象。我想過在A和B的每個屬性ref *之間使用一對一的方式,但我迷路了:)你能提供建議嗎?我想使用SchemaExport。

謝謝。

回答

1

您可以通過使用OneToOne-Annotation的Cascade屬性來實現此行爲。所以用Hibernate註解/ JPA批註你幾乎碰到這樣的:在

@Entity 
public class AClass{ 
    @Id 
    @GeneratedValue 
    private long id; 
    @OneToOne(cascade={Cascade.ALL, Cascade.DELETE_ORPHANS}) 
    private BClass b_1; 
    @OneToOne(cascade={Cascade.ALL, Cascade.DELETE_ORPHANS}) 
    private BClass b_2; 
} 

@Entity 
public class BClass{ 
    private String someField; 
} 

一個XML映射的關聯應該是這個樣子:

<hibernate-mapping> 
    <class name="AClass"> 
     <one-to-one cascade="all,delete-orphans" name="b_1" class="BClass" /> 
     <one-to-one cascade="all,delete-orphans" name="b_2" class="BClass" /> 
    </class> 
</hibernate-mapping> 

這應該給你在級聯持久化操作的通緝行爲到BClasses上並從持久層中刪除任何未引用的BClass對象。

玩得開心!

Frank

+0

感謝,但我一直在尋找基於XML映射... – gotch4 2010-02-10 15:11:49

+0

而且你確信它是安全使用一對A對於A來說不是一對多嗎? – gotch4 2010-02-10 15:21:22

+0

以及依賴於數據模型,如果你有一個且只有一個引用從一個AClass到一個BClass的工作,即使有兩個字段在AClass中持有BClasses。他們只是不應該引用相同的實例 – fasseg 2010-02-10 20:19:42

0

您有@OneToMany的關係。但是,由於沒有可用的@OneToTwo關係,您必須將ORM適用於您的模型。

<hibernate-mapping> 
    <class name="ClassAa"> 
     <list name="classBbList"> 
      <key column="CLASS_AA_ID" not-null="true"/> 
      <list-index column="CLASS_BB_INDEX"/> 
      <one-to-many class="ClassBb"/> 
     </list> 
    </class> 
<hibernate-mapping> 

現在你ClassAa看起來像

public class ClassAa { 

    private ClassBb classBb1; 
    private ClassBb classBb2; 

    private List<ClassBb> classBbList = new ArrayList<ClassBb>(); 

    public void setClassBb1(ClassBb classBb1) { 
     // You can use index 0 to store your classBb1 
     if(getClassBbList().size == 0) 
      getClassBbList().add(classBb1); 
     else 
      getClassBbList().set(0, classBb1); 
    } 

    public ClassBb getClassBb1() { 
     if(getClassBbList().size() == 0) 
      return null; 

     return getClassBbList().get(0); 
    } 

    public void setClassBb2(ClassBb classBb2) { 
     // You can use index 1 to store your classBb2 
     switch(getClassBbList().size()) { 
      case 0: 
       getClassBbList().add(null); 

       getClassBbList().add(classBb2); 
      break; 
      case 1: 
       getClassBbList().add(classBb2); 
      break; 
      case 2: 
       getClassBbList().set(1, classBb2); 
      break; 
     } 
    } 

    public ClassBb getClassBb2() { 
     if(getClassBbList().size() < 2) 
      return null; 

     return getClassBbList().get(1); 
    } 

    public List<ClassBb> getClassBbList() { 
     return this.classBbList; 
    } 

    public void setClasBbList(List<ClassBb> classBbList) { 
     this.classBbList = classBbList; 
    } 

} 

問候,