单向关联
Employee类
package Mapping;
import java.util.Calendar;
public class Employee {
private Long id;
private String employeeNo;
private String employeeName;
private char gender;
private Calendar birthdate;
private double salary;
public Employee() {
}
public Employee(String employeeNo, String employeeName, char gender,
Calendar birthdate, double salary) {
this.employeeNo = employeeNo;
this.employeeName = employeeName;
this.gender = gender;
this.birthdate = birthdate;
this.salary = salary;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getEmployeeNo() {
return employeeNo;
}
public void setEmployeeNo(String employeeNo) {
this.employeeNo = employeeNo;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public Calendar getBirthdate() {
return birthdate;
}
public void setBirthdate(Calendar birthdate) {
this.birthdate = birthdate;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
Department类
package Mapping;
import java.util.Set;
public class Department {
private Long id;
private String deptName;
private String telephone;
private Set<Employee> employees; //引用员工的集合属性
public Department() {}
public Department(String deptName, String telephone, Set<Employee> employees) {
super();
this.deptName = deptName;
this.telephone = telephone;
this.employees = employees;
}
//employees的getter和setter方法
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
}
Department.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="Mapping">
<class name="Department" table="department" lazy="true" > <!-- lazy:延迟加载 -->
<id name="id" column="id">
<generator class="identity"/>
</id>
<property name="deptName" type="string" column="dept_name"/>
<property name="telephone" type="string" column="telephone"/>
<set name="employees" table="employee" lazy="false"
inverse="false" cascade="all" sort="unsorted">
<!-- 一对多单向关联inverse(用于表示双向关联中被动的一端,值为false的一方负责维护关联关系)
设置为false,双向设置为true
cascade:级联关系 sort:排序关系-->
<key column="dept_id" /> <!-- 关联表(多方)的外键名 -->
<one-to-many class="Mapping.Employee" />
</set>
</class>
</hibernate-mapping>
测试
package Mapping;
import java.util.*;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;
public class OneToManyUnidirectionalAssociation {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Employee emp1 = new Employee("901","王小明",'M',new GregorianCalendar(1972,11,20),3500.00);
Employee emp2 = new Employee("902","张大海",'F',new GregorianCalendar(1989,5,14),4800.00);
Set<Employee> employees = new HashSet<Employee>();
employees.add(emp1);
employees.add(emp2);
Department depart = new Department("软件开发部","3400222",employees);
session.save(depart);
tx.commit();
//对于单向的一对多关联,查询时只能从"一"方导航到"多"方
String query_str = "from Department d inner join d.employees e";
Query query = session.createQuery(query_str);
List list = query.list();
for(int i=0;i<list.size();i++){
Object obj[] = (Object[])list.get(i);
Department dept = (Department)obj[0]; //dept是数组中第一个对象
Employee emp = (Employee)obj[1]; //emp是数组中第二个对象
System.out.println(dept.getDeptName()+":"+emp.getEmployeeName());
}
}
}
结果
双向关联
设置一对多双向关联,需在"多”方的类(如Employee类)中添加访问"一"方对象的属性和setter及getter方法。
在上面Employee类基础上添加如下代码:
private Department department;
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
在"多”方的映射文件中使用<many-to-one>元素定义多对一关联。
Employee.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="Mapping">
<class name="Employee" table="employee" >
<id name="id" column="id">
<generator class="identity"/>
</id>
<property name="employeeNo" type="string" column="employee_no"/>
<property name="employeeName" type="string" column="employee_name"/>
<property name="gender" type="char" column="gender"/>
<property name="birthdate" type="calendar" column="birthdate"/>
<property name="salary" type="double" column="salary" />
<!-- 一对多双向关联 多方需添加部分 -->
<many-to-one name="department" class="Mapping.Department"
cascade="all" outer-join="auto" column="dept_id" />
</class>
</hibernate-mapping>
此外,还需要把 Department.hbm.xml中的<set>元素的inverse属性值设置为true。
测试
package Mapping;
import java.util.GregorianCalendar;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;
public class OneToManyBidirectionalAssociation {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Department depart = new Department();
depart.setDeptName("财务部");
depart.setTelephone("112233");
Employee emp1 = new Employee("1001","王小明",'男',new GregorianCalendar(1972,2,11),3500.00);
Employee emp2 = new Employee("1002","张大海",'女',new GregorianCalendar(1989,11,14),4800.00);
emp1.setDepartment(depart);
emp2.setDepartment(depart);
session.save(emp1);
session.save(emp2);
tx.commit(); //*若事务未提交数据库中没保存数据
//查询员工及部门信息,这里用到了实体连接的功能,它是从"多"方导航到"一"方
String queryString = "from Employee e inner join e.department d";
Query query = session.createQuery(queryString);
List list = query.list();
for(int i=0;i<list.size();i++){
Object obj[] = (Object[])list.get(i);
Employee emp = (Employee)obj[0]; //emp是数组中第一个对象
Department dept = (Department)obj[1]; //dept是数组中第二个对象
System.out.println(dept.getDeptName()+":"+emp.getEmployeeName());
}
}
}
结果