Hibernate3.5.3 之 多对一关联映射

package com.ethan.domain;

public class Employee {
	private Integer id;
	private String name;
	
	//如果是departId,还得再查一次,才可以得到department对象信息,一种对象导航
	private Department depart;

	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 getDepart() {
		return depart;
	}

	public void setDepart(Department department) {
		this.depart = department;
	}

	@Override
	public String toString() {
		return "id="+id+"\tname="+name;
	}
}
<?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="com.ethan.domain">
	<class name="Employee">
		<id name="id">
			<generator class="native"/>
		</id>
		<!-- name unique -->
		<property name="name"/>
		
		<!-- departId外键参考department表 -->
		<many-to-one name="depart" column="departId"/>		
	</class>
</hibernate-mapping>

package com.ethan.domain;

import java.util.HashSet;
import java.util.Set;

public class Department {
	private Integer id;
	private String name;
	private Set<Employee> emps = new HashSet<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;
	}
	public Set<Employee> getEmps() {
		return emps;
	}
	public void setEmps(Set<Employee> emps) {
		this.emps = emps;
	}
}

<?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="com.ethan.domain">
	<class name="Department">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<!-- name unique -->
		<property name="name"/>
		<!-- 如果是delete,那么部门删除时,它下边的员工也会跟着删除 -->
		<set name="emps" inverse="true" cascade="save-update">
			<key column="departId"></key>
			<one-to-many class="Employee"/>
		</set>
	</class>
</hibernate-mapping>

package com.ethan.hibernate;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.ethan.domain.Department;
import com.ethan.domain.Employee;
import com.ethan.hibernate.util.HibernateUtil;

public class Many2One {
	
	public static void add() {
		Session s = null;
		Transaction tx = null;
		
		try {
			Department depart = new Department();
			depart.setName("ddd");
			
			Employee emp = new Employee();
			//建立对象关联,产出update语句
			emp.setDepart(depart);
			emp.setName("eeee");
			
			Employee emp2 = new Employee();
			//建立对象关联 产出update语句
			emp2.setDepart(depart);
			emp2.setName("eeee2");
			
			Set<Employee> emps = new HashSet<Employee>();
			emps.add(emp);
			emps.add(emp2);
			//会多两条update, update employee departId
			//对象模型映射关联
			//设置了inverse="true"之后,不会产生update语句了
			depart.setEmps(emps);
			
			s = HibernateUtil.getSession();
			tx = s.beginTransaction();
			
			//如果映射文件没设置,这里又注释了,则会出异常,因为emp拿不到depart的id去给depart_id插入
			//设置了cascade,(还是)会多两条update语句
			//下边会产生四条update语句,什么也还没设置
			/*s.save(emp);
			s.save(emp2);*/
			s.save(depart);
			
			/*先保存一方,则只有两条update
			 * s.save(depart);
			 * s.save(emp);
			s.save(emp2);
			 */
			//注释了下面两句,就会报瞬时对象未保存,如果设置了cascade就好了
			/*s.save(emp);
			s.save(emp2);*/
			
	//--------------------------------------
			/*//这种保存顺序,会多一条更新语句,如果先保存多方
			//<many-to-one name="depart" column="departId" not-null="true"/>
			//设置后,会报非空约束,departId --->NULL
			s.save(emp);
			
			//emp,depart持久态了,会感知到变化
			s.save(depart);*/
			
			
			tx.commit();
		} finally {
			if(s!=null) {
				s.close();
			}
		}
	}
	
	public static Employee query(int empId) {
		Session s = null;
		Transaction tx = null;
		
		try {
			s = HibernateUtil.getSession();
			tx = s.beginTransaction();
//			Employee emp = (Employee) s.get(Employee.class, empId);
			//两条查询 语句
			Employee emp = (Employee) s.load(Employee.class, empId);
			System.out.println(emp.getDepart().getName());
			tx.commit();
			return emp;
		} finally {
			if(s!=null) {
				s.close();
			}
		}
	}
}


package com.ethan.test;

import static org.junit.Assert.*;

import org.junit.Test;

import com.ethan.domain.Employee;
import com.ethan.hibernate.Many2One;

public class TestMany2One {

	@Test
	public void add() {
		Many2One.add();
	}

	@Test
	public void query() {
		Employee emp = Many2One.query(2);
		//System.out.println(emp);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值