Hibernate 级联操作 cascade

原创 2012年03月30日 13:16:34

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


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

在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();
 }

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Hibernate级联操作和加载机制(一) cascade and fetch

本篇介绍Hibernate的级联操作和加载机制首先来看级联,级联在Hibernate中用cascade这一属性表示,首先看什么是级联。比如在关系映射中,无论是一对一还是一对多还是其他:对象A和对象B是...

SSH框架之Hibernate的inverse属性、cascade级联操作

一、inverse属性 1、Inverse属性,是在维护关联关系的时候起作用的。 表示控制权是否转移。(只在一的一方起作用(本例中为Dept),多的一方无法使用)

Hibernate级联操作和加载机制(二) cascade and fetch

上一篇介绍了Hibernate持久化对象时候的级联操作,本篇介绍读取时候的级联操作。还是用上一篇的例子,一份问卷有多个问题,但是每个问题只能属于一份问卷。我们先看测试用例: @Test ...

【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作

【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作 分类: SSH2014-11-18 10:24 534人阅读 评论(0) 收藏 举报 cascad...

【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作

Hibernate的级联

HIbernate级联操作cascade以及inverse管理关系

cascade叫级联,有了级联可以使我们在操作(增删改查)数据时,避免因为各种各样的原因,丢掉向关联的数据库,下面先把cascade的总结写一下 总结: 1、cascade时级联操作,使得在操作一端数...

Hibernate入门(五)hibernate的级联(cascade)表操作

存在的意义在实际做项目的时候,经常会遇到表与表之间的关联操作,比如一个班级里面有多个学生,一个部门有多个职员,这是一对多的关系,还有例如一个主题有一个作者,这是一对一,等,这时候就必须涉及到表的关联操...

Hibernate入门(五)hibernate的级联(cascade)表操作

存在的意义 在实际做项目的时候,经常会遇到表与表之间的关联操作,比如一个班级里面有多个学生,一个部门有多个职员,这是一对多的关系,还有例如一个主题有一个作者,这是一对一,等,这时候就必须涉及到表...

Hibernate入门(五)hibernate的级联(cascade)表操作

存在的意义 在实际做项目的时候,经常会遇到表与表之间的关联操作,比如一个班级里面有多个学生,一个部门有多个职员,这是一对多的关系,还有例如一个主题有一个作者,这是一对一,等,这时候就必须涉及到表...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)