在這里舉了一個不太恰當的例子:雙親和孩子。當然舉這個例子也有一定的道理,一個孩子至少有兩個parent,但是例子只是例子,重點不是例子而是配置方法。下面我們看一下配置的詳細步驟:
實體:
package uni.many2one;
public class Child {
private int id;
private String name;
public Child(int id, String name) {
super();
this.id = id;
this.name = name;
}
public Child() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package uni.many2one;
public class Parent {
private int id;
private String name;
private Child child;
public Parent() {
}
public Parent(int id, String name, Child child) {
super();
this.id = id;
this.name = name;
this.child = child;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
}
hbm配置文件:
<hibernate-mapping>
<class name="uni.many2one.Child">
<id name="id" column="did">
<generator class="native" />
</id>
<property name="name" type="string" column="name"></property>
</class>
</hibernate-mapping>
<hibernate-mapping>
<!-- <class name="org.hibernate.wk.Student" dynamic-insert="true" dynamic-update="true"> -->
<class name="uni.many2one.Parent">
<id name="id" column="did">
<generator class="native" />
</id>
<property name="name" type="string" column="name"></property>
<!-- configure the many to one association -->
<many-to-one name="child" column="child"></many-to-one>
</class>
</hibernate-mapping>
測試文件:
public void testAdd() {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.getCurrentSession();
session.beginTransaction();
Child c1 = new Child();
c1.setName("child1");
Parent mother = new Parent();
mother.setName("Mother");
mother.setChild(c1);
Parent father = new Parent();
father.setName("Daddy");
father.setChild(c1);
session.save(c1);
session.save(mother);
session.save(father);
session.beginTransaction().commit();
}
測試結果:
Hibernate: insert into Child (name) values (?)
Hibernate: insert into Parent (name, child) values (?, ?)
Hibernate: insert into Parent (name, child) values (?, ?)
這里我沒有貼出來表的結構,因為表hibernate會自動生成的,多以就沒有浪費地方。
hibernate關聯關系映射的配置中務必要搞清楚誰是主動配置方,誰是被配置的,如果搞不清楚很容易在實體操作的時候出現錯誤。尤其是在保存實體的時候,很容易出現引用為空的情況。