日期:2014-05-18  浏览次数:20756 次

J2EE之路(七)hibernate(03)关联映射

关联映射

  • 多对一(Employee - Department)
  • 一对多(Department - Employee)
  • 一对一(person - idcard)
  • 多对多(teacher - student)
  • 组合映射(User - Name)
  • 集合映射(set,list,map,sag)
  • inverse和cascade(Employ - department)

多对一映射(Employee = Department)

?

映射文件<many-to-one name="depart" column="depart_id"/>

可以看出,我们可以只关心对象模型,关系模型由hibernte来维护。

对应一下Department类

package domain;

public class Employee {
	private int id;
	private String name;
	private Department depart;
	
	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 getDepart() {
		return depart;
	}
	public void setDepart(Department depart) {
		this.depart = depart;
	}
}

?可以看出Employee类持有department类的引用,在配置文件中只要把属性放进名字即可。

看一下自动生生成的Employee表的建表语句,果然生成了外键。

PS:只是标签从property编程了many-to-one其他的貌似都没变

测试一下:

package test;

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

import Util.HibernateUtils;
import domain.Department;
import domain.Employee;
import domain.User;

public final class TestMany2One {
	public static void main(String[] args) {
		add();
		query(1);
	}

	private static void add() {
		Session session = null;
		Transaction transaction = null;
		try{
			session = HibernateUtils.getSession();
			transaction = session.beginTransaction();
			Department depart = new Department();
			depart.setName("depart01");
			Employee employee = new Employee();
			employee.setName("employee01");
			employee.setDepart(depart);//对象模型:建立两个对象的关联
			session.save(depart);
			session.save(employee);
			transaction.commit();
		}catch(Exception e){
			e.printStackTrace();
			transaction.rollback();
		}finally{
			if(session != null)
				session.close();
		}
	}
	
	private static Employee query(int id) {
		Session session = null;
		try{
			session = HibernateUtils.getSession();
			Employee employee = (Employee) session.get(Employee.class,id);
			System.out.println(employee.getDepart().getName());
			return employee;
		}finally{
			if(session != null)
				session.close();
		}
	}
}

?

?一对多(Department - Employee)

?在Department类中增加属性Set<Employee> emps 表示一对多

在Deppartment的配置文件中增加

<set name="emps">

?<key column="depart_id"/>

<one-to-many calss="Employee"/>

</set>

?

一对一(person - idcard)

?

基于主键的one-to-one(person的映射文件)

<id name="id">

?<generator class="foreign">

<param name="property">idcard<param>

</generator>

<id>

<one-to-one name="idCard" constrained="true">

?

多对多(teacher - student)

?

在操作和性能方面都不太理想,所以多对多映射使用较少,实际使用中最好转换成一对多的模型,Hibernate会为我们创建中间关联表,转换成两个一对多。

<set name="teacher" table="teacher_student">

<key column="teacher_id">

<many-to-many class="student" column="student">

</>

?

组合映射(User - Name)

感觉就是这个对象不是很大,不用使用一张表来表示他比如姓和名直接放进User表就好

标签如下:

<compoment name="name">

<property name="firstName" column="first_name">

<property name="lastName" column="last_name">

</compoment>

?

最后零散笔记吧

?

级联操作:<set name="emps" cascade="save-update">

一对多,多对一是相互的,一般一的这一方面放弃对关系的维护:<se