Hibernate 关系映射
来源:互联网 发布:fiio music 软件 编辑:程序博客网 时间:2024/06/05 00:20
1.。多对一
public class Department {
private int id;
private String name;
//getter和setter方法略
}
public class Employee {
private int id;
private String name;
private Department depart;
//getter和setter方法略
}
在xxx.hbm.xml配置:
Department.hbm.xml
<hibernate-mappingpackage="com.yinger.domain">
<classname="Department">
<idname="id">
<generatorclass="native" />
</id>
<propertyname="name"/>
</class>
</hibernate-mapping>
Employee.hbm.xml
<hibernate-mappingpackage="com.yinger.domain">
<classname="Employee">
<idname="id">
<generator class="native" />
</id><property name="name"/>
<!-- 多对一映射 name是对应的属性名 column是对应的表的字段名[可以不指定]Hibernate 会自动的根据数据库中的
这个字段的值到属性对应的类对应的表里查找对象 -->
<many-to-one name="depart" column="depart_id"></many-to-one>
</class>
</hibernate-mapping>
2.一对多映射
在原有的 Department.java 中添加
属性 private Set<Employee> emps; 以及相应的get和set方法
删掉 Employee.hbm.xml 中的多对一映射
修改 Department.hbm.xml 添加
<!-- 一对多的映射,key属性一定要有,指定字段名,这个字段是“多”的那个表中的字段名 class属性是指set中的元素的类型 -->
<setname="emps">
<keycolumn="depart_id" />
<one-to-many class="Employee"/>
</set>
3.一对一映射
两种映射方法:① 基于主键的 一对一
② 基于外键的 一对一
public class Person {
private int id;
private String name;
private IdCard idCard; //对象
//getter和setter方法略
}
public class IdCard {
private int id;
private Date life;
private Person person; //对象
//getter和setter方法略
}
添加 映射文件
如果是第一种,基于主键的一对一:此时 person表中id和id_card 表中的id一一对应
Person.hbm.xml
<hibernate-mappingpackage="com.yinger.domain">
<classname="Person">
<idname="id">
<generatorclass="native" />
</id>
<propertyname="name"/>
</class>
</hibernate-mapping>
IdCard.hbm.xml
hibernate-mapping package="com.yinger.domain">
<class name="IdCard" table="id_card">
<id name="id">
<generatorclass="foreign">
<paramname="property">person</param>
</generator>
</id>
<propertyname="life" />
<one-to-onename="person" constrained="true"/>
</class>
</hibernate-mapping>
如果是第二种,基于外键的一对一:此时 id_card 表中的字段 person_id 与 person 表中的 id对应
Person.hbm.xml
<hibernate-mapping package="com.yinger.domain">
<class name="Person">
<idname="id">
<generatorclass="native" />
</id>
<propertyname="name"/>
</class>
</hibernate-mapping>
IdCard.hbm.xml
<hibernate-mapping package="com.yinger.domain">
<class name="IdCard" table="id_card">
<!-- 基于外键的一对一映射,加上了unique="true"约束,相当于就是一对一映射首先假设多个idCard对应一个person,但是加上了unique约束之后就变成了一个idCard对应一个person-->
<idname="id">
<generatorclass="native" />
</id><property name="life" />
<many-to-onename="person" column="person_id" unique="true">
</many-to-one></class><
/hibernate-mapping>
使用原则:多数情况下都是使用set,需要保证顺序使用list,但是想用List而又不需要保证顺序使用bag
注意点:
① 定义成 Set,而不是 HashSet
② 原来是 HashSet,保存了之后就不再是 HashSet 了,强制转型时会报错的!
原因是Hibernate进行的封装,变成了 PersistentSet,实现了 Set 接口,但是和 HashSet 没有关系,不能转型!
关系级联的设置
cascade:关系级联的处理方式,默认是 none
多对多和多对一 一般不配置级联
一对一 一般是 delete(前提是主从对象是同生共死的关系)
一对多 一般是 save-update
delete 就是说,比如删除一个部门,那么就要删除这个部门的所有的员工,这个一般是不符合实际的
inverse :是否放弃维护关联关系
如果是true的话,当某个对象是持久对象时,如果和它关联的对象发生了改变,Hibernate是不会产生update语句来进行更新的,所以会产生错误
注意:如果是true的话,那么一对多中的“多”一定要被告知是对应哪个“一”,否则数据库中“一”的字段会出现 null!
- hibernate映射关系一对一映射
- Hibernate关系映射
- Hibernate 继承关系映射
- Hibernate关系映射
- Hibernate 映射关系
- Hibernate组合映射关系
- Hibernate关系映射详解
- Hibernate 关系映射
- hibernate映射关系理解
- hibernate--关系映射CRUD
- Hibernate关系映射
- Hibernate关系映射
- hibernate映射关系
- hibernate映射关系
- Hibernate映射组成关系
- hibernate 的映射关系
- Hibernate关系映射一对一
- Hibernate关系映射详解
- NSDate和NSString之间的相互转化
- iOS5 UIKit新特性---定制各种控件
- 线段树-模板
- Aptana Studio 3 中设置 Sencha Touch 的代码提示
- (转)深拷贝与浅拷贝探析
- Hibernate 关系映射
- Enemy is weak 树状数组
- 节点的removeChild和addChild使用注意点
- ObjectType HOOK干涉注册表操作
- perl 脚本实现简单搜索修改文件并生成diff文件
- Quoted-Printable编码
- linux下光标定位和清屏函数
- tomcat工程发布的xml文件格式
- 自增操作符重载