一对多关联映射

单向关联

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());
		}

	}

}

结果






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis是一款优秀的ORM框架,支持一对一、一对多、多对一、多对多等关联映射。其中,一对多关联映射是指一个实体类中包含多个另一个实体类的对象。下面是一对多关联映射的实现方法: 1.在主实体类中定义一个包含从实体类对象的List集合属性。 2.在主实体类对应的Mapper.xml文件中,使用<collection>标签来映射从实体类对象的List集合属性。 3.在从实体类对应的Mapper.xml文件中,使用<association>标签来映射主实体类对象。 具体实现可以参考以下代码: 主实体类User: ``` public class User { private Integer id; private String username; private List<Order> orders; //getter和setter方法 } ``` 从实体类Order: ``` public class Order { private Integer id; private String orderNo; private User user; //getter和setter方法 } ``` 主实体类User对应的Mapper.xml文件: ``` <mapper namespace="com.biem.mapper.UsersMapper"> <resultMap id="userMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <collection property="orders" ofType="Order"> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> </collection> </resultMap> <select id="getUserById" resultMap="userMap"> select * from user where id=#{id} </select> </mapper> ``` 从实体类Order对应的Mapper.xml文件: ``` <mapper namespace="com.biem.mapper.OrdersMapper"> <resultMap id="orderMap" type="Order"> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <association property="user" javaType="User"> <id property="id" column="user_id"/> <result property="username" column="username"/> </association> </resultMap> <select id="getOrderById" resultMap="orderMap"> select * from order where id=#{id} </select> </mapper> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值