一对多关联通过外键连接两个类对应的表,而没有中间集合表。
One:
package org.hibernate.domain;
import java.util.Set;
public class Department {
private int id;
private String name;
private Set<Employee> employees;
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 Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
@Override
public String toString() {
return "Department [id=" + id + ", name=" + name + ", employees="
+ employees + "]";
}
}
Many:
package org.hibernate.domain;
public class Employee {
private int id;
private String name;
private Department department;
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 Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", department="
+ department + "]";
}
}
映射文件:
<?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="org.hibernate.domain"> <class name="Department" table="department"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <set name="employees"> <key column="department_id" /> <one-to-many class="Employee"/> </set> </class> </hibernate-mapping>
<?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="org.hibernate.domain"> <class name="Employee" table="employee"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <!-- 如果忽略了column这个属性那么默认的外键与实体的属性一致 --> <many-to-one name="department" column="department_id" /> </class> </hibernate-mapping>
测试类:
package org.hibernate.test;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.domain.Department;
import org.hibernate.domain.Employee;
import org.hibernate.util.HibernateUtil;
public class OneToMany {
public static void main(String[] args) {
Department department = add();
department = queryDepartmentByDepartmentId(department.getId());
}
public static Department add() {
Session session = null;
Transaction tx = null;
try {
Department department = new Department();
department.setName("department name");
Employee emp1 = new Employee();
emp1.setDepartment(department);// 对象模型:建立两个对象的关联
emp1.setName("emp1 name");
Employee emp2 = new Employee();
emp2.setDepartment(department);// 对象模型:建立两个对象的关联
emp2.setName("emp2 name");
session = HibernateUtil.getSession();
tx = session.beginTransaction();
session.save(department);
session.save(emp1);
session.save(emp2);
tx.commit();
return department;
} finally {
if (session != null)
session.close();
}
}
public static Department queryDepartmentByDepartmentId(int departmentId) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUtil.getSession();
tx = s.beginTransaction();
Department department = (Department) s.get(Department.class,
departmentId);
Hibernate.initialize(department.getEmployees());
tx.commit();
return department;
} finally {
if (s != null)
s.close();
}
}
}
控制台打印结果: