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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值