我正在尝试在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
}
我对以上代码有以下疑问
2
<many-to-one name="shelf" class="Shelf" >
<column name="SHELF_ID" not-null="true"></column>
</many-to-one>
在h.hm里面我们在Book.hbm.xml文件中映射文件
为什么这里有多对一的标签?
答案 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)
最好将其称为parent-child relation
,然后master-child relation
hibernate中的关系是单向的。
这意味着当您在Shelf中创建one-to-many relation
时,不会在Book类中自动创建many-to-one
关系。如果需要,您需要为Book明确创建many-to-one
关系。