Hibernate 级联操作 cascade

标签: hibernatestringusersessiondeletemerge
1771人阅读 评论(1) 收藏 举报
分类:

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


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

在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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    原"老A"特战队员
    个人资料
    • 访问:2372479次
    • 积分:26289
    • 等级:
    • 排名:第225名
    • 原创:520篇
    • 转载:14篇
    • 译文:4篇
    • 评论:1393条
    我的微博
    博客专栏