`
txf2004
  • 浏览: 6876561 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    hibernate 级联(cascade和inverse)一对多

    hibernate 级联(cascade和inverse)一对多,Jar包,数据库建表语句都好了,只要修改一下,数据库配置文件,就可以使用了,使用junit进行测试。

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    inverse Hibernate_级联关系说明_-_关于cascade和inverse的用法

    Hibernate cascade (级联).doc

    Hibernate cascade (级联).docHibernate_cascade(级联).doc

    详解Hibernate cascade级联属性的CascadeType的用法

    详解Hibernate cascade级联属性的CascadeType的用法 cascade(级联) ...cascade表示级联操作,在hibernate配置注解@OneToOne,@OneToMany,@ManyToMany,@ManyToOne中的属性。 例如: @ManyToOne(c

    hibernate many-to-one(多对一)及 cascade(级联).doc

    深入理解hibernate many-to-one(多对一)及 cascade(级联).

    Hibernate many-to-many

    两套hibernate级联例子,jar包已经包含在里面了,运行代码也写好了,数据库直接会自动生成表的,就差你运行了,你懂的

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...

    hibernate总结

    Hibernate级联操作对象的关系属性: 映射文件中设置: 1. Cascade a) none b) Save-update 当使用session的api对当前对象进行save,update操作时,对它的关系属性也进行save或者update c) Delete d) All = delete ...

    Hibernate注解

    很奇怪),分别是CascadeType.PERSIST(级联新建),CascadeType.REMOVE(级联删除),CascadeType.REFRESH(级联刷新),CascadeType.MERGE(级联更新),CascadeType.ALL(全部四项) * 方法一 * 主表: ?@OneToOne...

    Hibernate注释大全收藏

    Hibernate注释大全收藏 声明实体Bean @Entity public class Flight implements Serializable { Long id; @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } } @Entity ...

    精通Hibernate:对象持久化技术第二版part3

    本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...

    jdbc基础和参考

    saveOrupdate,会级联操作和它相关联的对象 delete:在删除当前对象的时候,级联删除和他相关联的对象 all: save-update+delete delete-orphan:解除关联关系时,删除和当前对象失去关联的对象 all-delete-orphan:all...

    千方百计笔试题大全

    94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...

    java面试宝典

    94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...

Global site tag (gtag.js) - Google Analytics