Hibernate 级联操作 cascade

这是为了更新而更新···也为了记录下。其实这些也没什么记录的必要,差文档就知道了。就当赚点点击率了··也为了刚开通的博客让搜索引擎多收录点文章。


--------------------------------------------------------------------------------

在hibernate中 有时候需要级联更新比如 级联 UPDATE,DELETE,INSERT 这时候可以更新一张表数据,让它自动更新另一张表数据。
这就是级联更新··

例子:
先看这两个实体

User,Group

他们关系是ManyTo One 多对一(多个学生在一个组)

package com.sccin.entity;

import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import javax.persistence.OneToMany;
import javax.persistence.Table;


@Entity
@Table(name="tb_group")
public class Group {

private int id;
private String name;

private Set<User> users;

@OneToMany(mappedBy="group")
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
@Id
@GeneratedValue
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;
}
}

User


--------------------------------------------------------------------------------
package com.sccin.entity;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import javax.persistence.ManyToOne;
import javax.persistence.Table;


@Entity
@Table(name="tb_user")
public class User {

private int id;
private String name;

private Group group;

@ManyToOne
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
@Id
@GeneratedValue()
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;
}
}

如果这样,默认情况下

我们保存一个学生并设置他属于哪个组,需要有那组的实体,才能保存学生

@test

@Test
public void Cascade(){
Session session = HibernateUitl.getSessionFactory().openSession();
User u = new User();
Group g = new Group();
g.setName("g");
u.setName("aa");
session.beginTransaction();
session.save(g);//先的有这个组
u.setGroup(g);
session.save(u);//在保存学生
session.getTransaction().commit();
session.close();
}
如何能够当我们设置学生属于哪个组保存学生时自动帮我们把Group保存呢?

只需要在设置表与表之间关系时设置cascade

修改User类中的

@ManyToOne(cascade = CascadeType.ALL)
public Group getGroup() {
return group;
}
文档中说:

2.2.5.4. 用cascading实现传播性持久化(Transitive persistence)
也许你已经注意到了cascade属性接受的值为CascadeType数组. 在EJB3中的cascade的概念和Hibernate中的传播性持久化以及cascade操作非常类似, 但是在语义上有细微的区别,支持的cascade类型也有点区别:

CascadeType.PERSIST: 如果一个实体是受管状态, 或者当persist()函数被调用时, 触发级联创建(create)操作
CascadeType.MERGE: 如果一个实体是受管状态, 或者当merge()函数被调用时, 触发级联合并(merge)操作
CascadeType.REMOVE: 当delete()函数被调用时, 触发级联删除(remove)操作
CascadeType.REFRESH: 当refresh()函数被调用时, 触发级联更新(refresh)操作
CascadeType.ALL: 以上全部

设置了Cascade 我们再保存时
@test

@Test
public void Cascade(){
Session session = HibernateUitl.getSessionFactory().openSession();
User u = new User();
Group g = new Group();
g.setName("g");
u.setName("aa");
u.setGroup(g);
session.beginTransaction();
//session.save(g);不需要我们手动保存group了,当保存User时会自动保存

session.save(u);
session.getTransaction().commit();
session.close();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值