首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

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

2013-12-04 
J2EE之路(七)hibernate(03)关联映射关联映射多对一(Employee - Department)一对多(Department - Employee)

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

热点排行