Hibernate:Hibernate中的一对多映射

时间:2012-06-20 11:19:22

标签: hibernate

我正在尝试在Hibernate中学习一对多的映射。

以下是我的两个java类     Shelf.java

    public class Shelf {
    private Integer id;
    private String code;
    private Set<Book> books = new HashSet<Book>();

//setter - getter methods

}


Book.java

    public class Book {
    private String name;
    private Integer id;
    private Shelf shelf;

//setter - getter methods
}

我对以上代码有以下疑问

  1. 应该将货架当作主表并将其作为子表处理? (因为Shelf.java包含许多Object Book的对象,或者没有任何这样的拇指规则来决定哪个是Master和Child Table)。
  2. 2

     <many-to-one name="shelf" class="Shelf" >
                <column name="SHELF_ID" not-null="true"></column>
            </many-to-one>
    

    在h.hm里面我们在Book.hbm.xml文件中映射文件

    为什么这里有多对一的标签?

2 个答案:

答案 0 :(得分:3)

[1]在1-N关系中,您可以配置的是哪个应该是所有者方。所有者方负责管理关系,程序员负责设置另一方,因此对象图将保持一致。 (如果你忘记这样做,Hibernate将保存关系,但你的对象图将暂时不一致)。

在这种情况下,拥有方可以是货架或书。除非你有某些理由选择其他方式,否则选择Shelf作为所有者更合乎逻辑,它将使您在以后使用分离实体时更轻松。

[2]在Book方面,你需要一个多对一的关系,在架子方面,你需要一对多的关系,见下面的映射。你需要这两个的原因是让Hibernate知道关系的两端应该连接起来形成一个关系,不应该作为单独的(单面)关系处理。

在.hbm文件中,您可以:

<class name="com.company.Shelf" table="SHELF">
        <id name="id" type="integer" column="ID">
            <generator class="increment" />
        </id>
        <property name="code" type="string" not-null="true" length="100" column="CODE" />
        <set name="books" table="BOOKS" cascade="all">
            <key column="SHELF_ID" />
            <one-to-many class="com.company.Book" />
        </set>
</class>

<class name="com.company.Book" table="BOOK">
        <id name="id" type="int" column="id">
            <generator class="increment" />
        </id>
        <property name="name" type="java.lang.String" column="name" length="255" />
        <many-to-one name="shelf" class="com.company.shelf" column="SHELF_ID" />
</class>

答案 1 :(得分:2)

  1. 最好将其称为parent-child relation,然后master-child relation

  2. hibernate中的关系是单向的。 这意味着当您在Shelf中创建one-to-many relation时,不会在Book类中自动创建many-to-one关系。如果需要,您需要为Book明确创建many-to-one关系。