Domain Object限制
1.必须有默认的构造方法
2.有无意义的标示符id(键)(可选)
3.非final的类,对懒加载有影响(可选)
----------------------------------------------------------------------------------------------------------------------------------------
关联映射
多对一(Employee - Department)
一对多(Department -Employee)
一对一(Person - IdCard)
多对多(teacher - student)
主键组件映射(User - Name)
集合映射(set,list,map,bag)
inverse和cascade(Employee - Department)
----------------------------------------------------------------------------------------------------------------------------------------
多对一(Employee - Department)
在Employee类中添加私有的Department属性
public class Employee {
private int employeeId;
private String employeeName;
private Department depart;
}
public class Department {
private int departmentId;
private String departmentName;
}
----------------------------------------------------------------------------------------------------------------------------------------
在Employee.hbm.xml中映射文件<many-to-one name="depart" column="depart_id">
默认外键是另一张表的主键,也可以指定为其他的唯一键 property-ref=“”;column属性可以不写,指定表中字段名,默认为对象中对应的名字。
Employee.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="hibernate.domain">
<class name="Employee" table="Employee" >
<id name="employeeId" column="employee_id" type="java.lang.Integer">
<generator class="native">
<param name="sequence">employee_sequence</param>
</generator>
</id>
<property name="employeeName" column="employee_name" type="java.lang.String" unique-key="true"/>
<many-to-one name="depart" column="depart_id"></many-to-one>
</class>
</hibernate-mapping>
Department.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="hibernate.domain">
<class name="Department" table="department" >
<id name="departmentId" column="depart_id" type="java.lang.Integer">
<generator class="native">
<param name="sequence">department_sequence</param>
</generator>
</id>
<property name="departmentName" column="depart_name" type="java.lang.String" unique-key="true"/>
</class>
</hibernate-mapping>
----------------------------------------------------------------------------------------------------------------------------------------
测试方法
public static Department add() {
Session s = null;
Transaction ts = null;
try {
Department depart = new Department();
depart.setDepartmentName("depart name");
Employee emp = new Employee();
emp.setEmployeeName("emp name");
emp.setDepart(depart);
s = HibernateUtil.getSession();
ts = s.beginTransaction();
s.save(depart);
s.save(emp);
ts.commit();
return depart;
} finally {
if (s != null)
s.close();
}
}
----------------------------------------------------------------------------------------------------------------------------------------
控制台显示
Hibernate: select department_sequence.nextval from dual
Hibernate: select employee_sequence.nextval from dual
Hibernate: insert into department (depart_name, depart_id) values (?, ?)
Hibernate: insert into Employee (employee_name, depart_id, employee_id) values (?, ?, ?)
----------------------------------------------------------------------------------------------------------------------------------------
根据职员的id查询他所属的部门
public static Employee query(int empId) {
Session s = null;
Transaction ts = null;
try {
s = HibernateUtil.getSession();
ts = s.beginTransaction();
Employee emp = (Employee) s.get(Employee.class, empId);
//这里出现懒加载的形式,如果不写这一句,则在返回的数据中只有员工的信息,没有员工所属部门的信息
ts.commit();
return emp;
} finally {
if (s != null)
s.close();
}
}
----------------------------------------------------------------------------------------------------------------------------------------
一对多(Department -Employee)
在一对多的关系中,通过部门获取他所有的员工信息,需要在Department类中添加一个Set集合保存员工信息。
在department.hbm.xml文件中写入
<set name="emps">
<!-- 表示外键 -->
<key column="depart_id"/>
<!-- 表示对应的对象 -->
<one-to-many class="Employee" />
</set>
----------------------------------------------------------------------------------------------------------------------------------------
测试方法
public static Department queryDepart(int departId) {
Session s = null;
try {
s = HibernateUtil.getSession();
Department depart = (Department) s.get(Department.class, departId);
Hibernate.initialize(depart.getEmps());
return depart;
} finally {
if (s != null)
s.close();
}
}
----------------------------------------------------------------------------------------------------------------------------------------
控制台显示
Hibernate: select department0_.depart_id as depart1_1_0_, department0_.depart_name as depart2_1_0_ from department department0_ where department0_.depart_id=?
Hibernate: select emps0_.depart_id as depart3_1_, emps0_.employee_id as employee1_1_, emps0_.employee_id as employee1_2_0_, emps0_.employee_name as employee2_2_0_, emps0_.depart_id as depart3_2_0_ from Employee emps0_ where emps0_.depart_id=?
emp1 name
emp2 name