关联映射
- 多对一(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">
一对多,多对一是相互的,一般一的这一方面放弃对关系的维护:<set name="emps" inverse="true">
以上只能是set,list不能指定inverse,所以一对多最好不用List,而用set