Hibernate中的级联和关系维护
来源:互联网 发布:学淘宝美工视频教程 编辑:程序博客网 时间:2024/05/21 20:28
cascade和inverse(Employee-Department)
1. Cascade用来说明当主对象进行某种操作时是否对其关联的从对象也做类似的操作,常用cascade;
2. cascade的属性取值有以下几种:
none(默认值)
all(对所有的操作都进行级联)
save-update(只有在保存和更新时做级联操作)
delete(在删除时做级联操作)
delete-orphan(one-to-many)
lock,refresh,evict,replicate,persist,merge
一般对many-to-one,many-to-many不设置级联,在one-to-one和one-to-many中设置级联(查了一些资料,据说一对一主键关联中默认设置了insert、update级联,即使声明cascade="none",这两种级联也是有效的。但delete级联却没有设置)。
3. inverse表示“是否放弃维护关联关系”(在java里两个对象产生关联时,对数据库表的影响)
在one-to-many和many-to-many的集合定义中使用,inverse="true"表示该对象不维护关联关系;
该属性的值一般在使用有序集合时设置成“false”(注意Hibernate的缺省值是false)
one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。
4. 注意:配置成one-to-one的对象不维护关联关系
/***************************************************************************************/
下面就以部门表和员工表为例来具体说明一下:
Department.java:
package cn.itcast.hibernate.domain;
import java.util.Map;
public class Department {
private int departID;
private String departName;
//在定义集合的时候一定定义成接口形式
// private Set<Employee> emps;//一对多,一个部门对应多个员工
// private List<Employee> emps;
private Map<String,Employee> emps; //这里牵扯到一个级联操作,来看Department.hbm.xml怎么配置
public int getDepartID() {
return departID;
}
public void setDepartID(int departID) {
this.departID = departID;
}
public String getDepartName() {
return departName;
}
public void setDepartName(String departName) {
this.departName = departName;
}
/* public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
}
*/
/*public List<Employee> getEmps() {
return emps;
}
public void setEmps(List<Employee> emps) {
this.emps = emps;
}*/
public Map<String, Employee> getEmps() {
return emps;
}
public void setEmps(Map<String, Employee> emps) {
this.emps = emps;
}
}
/***********************************************************************************/
Department.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.hibernate.domain">
<class name="Department">
<id name="departID">
<generator class="native"/>
</id>
<property name="departName" />
<map name="emps" cascade="save-update"> //这样在保存和更新部门信息的时候,会级联更新部门表中的外键
<key column="depart_id"></key>
<map-key type="string" column="key1"></map-key>
<one-to-many class="Employee" />
</map>
</class>
</hibernate-mapping>
/********************************************************************************/
下面看测试类:(这里只列出主要代码)
Employee emp = new Employee();
emp.setEmpName("李全党");
Employee emp1 = new Employee();
emp1.setEmpName("张子琪");
Department depart = new Department();
depart.setDepartName("人事管理");
Map<String,Employee> emps = new HashMap<String,Employee>();
emps.put(emp.getEmpName(),emp);
emps.put(emp.getEmpName(),emp1);//对象模型:建立两个对象的关联
//如果在Department.hbm.xml里配置啦inverse="true",那么下面这句话就不会起作用
//在Employee表里depart_id和key1这两个字段都会为空null。不会更新外键。
depart.setEmps(emps);
Department depart1 = new Department();
depart1.setDepartName("研发部");
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//在设置好cascade属性后,在这里只保存部门信息就行啦,Hibernate会进行级联操作
// session.save(emp);
// session.save(emp1);
session.save(depart);
session.save(depart1);
tx.commit();
下面看截图:
在没有设置inverse的时候(默认inverse="false"),这样Hibernate就会维护对象的关联关系:
在设置inverse="true" ,这样Hibernate就会放弃关联,不会更新外键depart_id:
- Hibernate中的级联和关系维护
- Hibernate关联关系 --- 集合映射中的级联保存和是否维护表的关联关系
- 对Hibernate中关系维护方和级联的理解
- hibernate中的级联关系小结
- 级联和关系维护(Cascade 和Inverse)
- hibernate之xml映射文件关系维护,懒加载,级联
- Hibernate中的级联一对多关系
- 13 级联和关系维护(Cascade 和Inverse)
- hibernate 的级联保存和关联关系
- hibernate 的级联保存和关联关系
- Hibernate 级联更新和外键维护-自我总结
- Hibernate (cascade)级联关系
- Hibernate级联关系问题
- Hibernate级联关系总结
- hibernate 级联关系
- hibernate级联关系思考
- Hibernate (cascade)级联关系
- hibernate级联关系 -----一对一
- 让服务器iis支持.apk文件下载的设置方法
- 数独游戏
- centos Apache、php、mysql默认安装路径
- nodejs+mysql 处理数据库中的时间戳返回到前台格式不对
- 使用IWebBrowser2创建简单浏览器
- Hibernate中的级联和关系维护
- 【memchace】PHP中常见增删改查
- ONOS中Channel状态机分析
- poj1023 二进制-十进制
- Hibernate之中inverse与cascade的异同
- 国嵌裸机开发下学习
- 初识三层
- Hibernate中的lazy属性
- 第八周上机实践项目2——Time类中的运算符重载