Department.java (一)
public class Department {
private int id;
private String name;
}
Employee.java(多)
public class Employee {
private int id;
private String name;
private Department department;
}
Department.hbm.xml
<class name="Department">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
Employee.hbm.xml
<class name="Employee">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!-- 多对一标签配置 -->
<span style="color:#ff0000;"><strong><many-to-one name="department" column="depart_id"/></strong></span>
</class>
测试类:分别保存一个Employee和Department
static Department addEmployee() {
Session session = null;
Transaction transaction = null;
try {
Department depart= new Department();
depart.setName("depart name");
Employee emp = new Employee();
emp.setDepartment(depart);
emp.setName("emp name");
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
session.save(depart);
session.save(emp);
transaction.commit();
return depart;
} finally {
if (session != null) {
session.close();
}
}
}
Hibernate在控制台中打印的sql语句如下:
如果将save的前后关系进行跌倒,先保存员工,在保存部门,sql语句如下:
与上面的sql语句相比,多了一条更新语句,为什么呢?
原因很简单:session.save(emp)之后,emp对象的状态为持久化状态,因为session还没有关闭,数据库中有这条数据。
但是emp的属性depart没有值,所以数据库中的这条数据的字段depart_id为空。
当我们进行session.save(depart)的时候,相当于emp对象的department属性发生了变化,hibernate这时可以进行管理。所以就产生update语句。
相当于,session.save(emp); emp.setName("xxx")
也会产生sql语句。
源码下载地址: