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 constrained="true">
?
多对多(teacher - student)
?
在操作和性能方面都不太理想,所以多对多映射使用较少,实际使用中最好转换成一对多的模型,Hibernate会为我们创建中间关联表,转换成两个一对多。
<set name="teacher" table="teacher_student">
<key column="teacher_id">
<many-to-many 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">
一对多,多对一是相互的,一般一的这一方面放弃对关系的维护:<set name="emps" inverse="true">
以上只能是set,list不能指定inverse,所以一对多最好不用List,而用set