0

我正在尝试在 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 的 Objects ?? 或者没有任何这样的经验法则来决定哪个是 Master 和 Child Table )

2.

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

在 Book.hbm.xml 文件中的 hbm 映射文件中,我们有

为什么这里是多对一标签?

4

2 回答 2

3

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

在这种情况下,拥有方可以是 Shelf 或 Book。除非您有其他选择的理由,否则选择 Shelf 作为所有者更合乎逻辑,这将使您以后在处理分离实体时更轻松。

[2] 在 Book 方面,您需要一个多对一关系,在 Shelf 方面,您需要一个一对多关系,请参见下面的映射。您需要这两者的原因是让 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>
于 2012-06-20T12:11:34.557 回答
2
  1. 最好把它称为parent-child relationthenmaster-child relation

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

于 2012-06-20T12:20:44.773 回答