昨天我们讲了多对一关系。今天我们就讲讲一对多的实现。
既然多个员工属于一个部门。
那么我们也可以说一个部门有多个员工。
首先我想说,不管是多对一还是一对多,他们的共同点就是两张表有联系。实现的实质就是通过找共同属性的字段(可以不同名字,但是在关联时候,类型是一致的)。
如果是员工表和部门表的话,那么我们可以通过部门编号来实现。
下面我写一个查找一个部门有多少人实例来说明1对多的实现方式。
1. 部门对象映射类
package com.fish.testdao;
import java.util.Set;
public class Department{
private Integer id;
private String name;
private Set<Employee> employee;//利用这个我们可以将一个部门的所有员工放到这个集合,到时候我们只要遍历这个集合我们就知道一个部门都有谁了。
public Set<Employee> getEmployee() {
return employee;
}
public void setEmployee(Set<Employee> employee) {
this.employee = employee;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2. 员工对象映射类
package com.fish.testdao;
public class Employee {
private Integer id;
private String name;
private Department department;//这个在这里做外键
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
}
3. 部门xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.fish.testdao.Department">
<id name="id" type="integer">
<generator class="increment"></generator>
</id>
<property name="name"></property>
<set name="employee">
<key column="department"></key>
<one-to-many class="com.fish.testdao.Employee"/>
</set>
</class>
</hibernate-mapping>
*注<set name="employee">说明这个集合要封装的是部门类中的set属性叫employee和类的属性是一致的
<keycolumn="department"></key> //关联的是员工表的这个属性
<one-to-manyclass="com.fish.testdao.Employee" /> //操作的是员工表
</set>
4. 员工xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.fish.testdao.Employee" >
<id name="id" column="id"type="integer">
<generator class="increment"></generator>
</id>
<property name="name" ></property>
<many-to-one name="department" ></many-to-one>
</class>
</hibernate-mapping>
我们写一个测试类
package com.fish.domain;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.fish.testdao.Department;
import com.fish.testdao.Employee;
public class Test2 {
//写一个得到session的模板
public static Session getMySession() {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
SessionFactory factory = configuration.buildSessionFactory();
Session session = factory.openSession();
return session;
}
//这是一个对部门有多少员工的查找
public static void query() {
String hql = "fromDepartment";
Session session = getMySession();
Query query = session.createQuery(hql);
List<Department> list = query.list();
for (Department i : list) {
System.out.println(i.getName()+"有");
for(Employee j:i.getEmployee()){
System.out.print( j.getName());
}
System.out.println("");
System.out.println("");
}
}
public static void main(String[] args) {
query();
}
}