因为时间关系,我在这里测试的环境是一对多的关系里面用到的注解方式的级联,网上也有很多贴子,我也看过了,但是呢,我还是自己总结一下吧,这觉得级联是单向的,不是双向的,意思就是说,我们在设置两个类的对象之间关系的时候,总是在一方设置的很具体,在另外一方设置一个mappedBy即可,但是如果想要两边都能删除的时候,或者在生成的时候,必须在两边都设置cascade=CascadeType.All才有效果,下面是测试代码,测试样例是参考马士兵的视频做的,

package com.jll.model;

import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table; @Entity
@Table(name="t_group")
public class Group {
private int id;
private String name;
private Set<User> users = new HashSet<User>(); @Id
@GeneratedValue
public int getId() {
return id;
} public String getName() {
return name;
} @OneToMany(mappedBy="group",cascade=CascadeType.ALL)
public Set<User> getUsers() {
return users;
} public void setId(int id) {
this.id = id;
} public void setName(String name) {
this.name = name;
} public void setUsers(Set<User> users) {
this.users = users;
} }

现在这里有cascade=CascadeType.ALL。在相关联的类的另一边同样也有,

package com.jll.model;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table; @Entity
@Table(name = "t_user")
public class User {
private int id;
private String name;
private Group group; @ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="groupId")
public Group getGroup() {
return group;
} @Id
@GeneratedValue
public int getId() {
return id;
} public String getName() {
return name;
} public void setGroup(Group group) {
this.group = group;
} public void setId(int id) {
this.id = id;
} public void setName(String name) {
this.name = name;
} public String toString(){
return this.getName()+"---"+this.getId()+"---"+this.getGroup().getId();
} }

测试代码:

package com.jll.model;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test; public class TestCoreAPI { private static SessionFactory sf=null;
private static Configuration configuration = new Configuration().configure(); @BeforeClass
public static void beforeClass(){
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
sf = configuration.buildSessionFactory(builder.build());
} @AfterClass
public static void afterClass(){
sf.close();
}
@Test
public void testRelationShip(){
SchemaExport se = new SchemaExport(configuration);
se.create(true, true);
Session session = sf.getCurrentSession();
Group g = new Group();
g.setName("group1");
User u1 = new User();
User u2 = new User();
/*u1.setGroup(g);
u2.setGroup(g);*/
u1.setName("u1");
u2.setName("u2");
Set<User> users = new HashSet<User>();
users.add(u1);
users.add(u2);
g.setUsers(users);
session.beginTransaction();
session.save(g);
session.getTransaction().commit();
}

生成的SQL语句如下:

alter table t_user
drop
foreign key FK_7ktm6l2qkykpqrf6oq01ys8wy drop table if exists t_group drop table if exists t_user create table t_group (
id integer not null auto_increment,
name varchar(255),
primary key (id)
) create table t_user (
id integer not null auto_increment,
name varchar(255),
groupId integer,
primary key (id)
) alter table t_user
add constraint FK_7ktm6l2qkykpqrf6oq01ys8wy
foreign key (groupId)
references t_group (id)
Hibernate:
insert
into
t_group
(name)
values
(?)
Hibernate:
insert
into
t_user
(groupId, name)
values
(?, ?)
Hibernate:
insert
into
t_user
(groupId, name)
values
(?, ?)

如果Group类没有加上级联的话,生成的语句如下:

alter table t_user
drop
foreign key FK_7ktm6l2qkykpqrf6oq01ys8wy drop table if exists t_group drop table if exists t_user create table t_group (
id integer not null auto_increment,
name varchar(255),
primary key (id)
) create table t_user (
id integer not null auto_increment,
name varchar(255),
groupId integer,
primary key (id)
) alter table t_user
add constraint FK_7ktm6l2qkykpqrf6oq01ys8wy
foreign key (groupId)
references t_group (id)
Hibernate:
insert
into
t_group
(name)
values
(?)

这里只插入了一次,而上面的那个插入了三次,所以我猜测级联是单向的,不是双向的,如果想要两边都可以进行crud,则被关联的类都要加上cascade=CascadeType.ALL,我也进行了删除测试,删除的时候必须先查出来,然后才能进行级联删除,得出来的结论也是与上面的实验一样,在这里就不贴代码了。

hibernate cascade=CascadeType.All的更多相关文章

  1. 转Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))

    一:Group和Users两个类 假定一个组里有n多用户,但是一个用户只对应一个用户组. 1.所以Group对于Users是“一对多”的关联关系@OneToMany Users对于Group是“多对一 ...

  2. hibernate CasCade deleted object ould be re-saved by cascade

    这个问题个人认为看你用的那种方式,如果是注解式的 比如: @ManyToMany(cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType. ...

  3. hibernate cascade的真正含义

    hibernate cascade 是 @OneToOne @OneToMany @ManyToOne @ManyToMany等注解的属性,表示级联操作. /** * (Optional) The o ...

  4. hibernate 的 CascadeType 属性

    hibernateintegerstringfloatclassmerge @Entity @Table(name="orders")public class Order { // ...

  5. Hibernate学习一:Hibernate注解CascadeType

    http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hi ...

  6. Hibernate Cascade & Inverse

    Cascade - 修改实体表 Inverse - 修改中间表 http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html 1.到底在 ...

  7. Hibernate cascade级联

    cascade: 级联: 是对象的连锁操作 级联保存(一对多): 级联保存: 当保存双向关系的一方时,默认会报告错误,此时应该在customr中设置级联保存,即操作一个对象时,通过操作其他关联对象 如 ...

  8. hibernate cascade

    默认:none Cascade 属性值: none:在保存.删除修改对象的时候,不考虑其附属物的操作 save-update:在保存.更新当前对象时,级联保存.更新附属物. delete:在删除当前对 ...

  9. hibernate注解CascadeType

    http://blog.csdn.net/strong8808/article/details/6318994(参考) CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体, ...

随机推荐

  1. [CF442C] Artem and Array (贪心+单调栈优化)

    题目链接:http://codeforces.com/problemset/problem/442/C 题目大意:一个数列,有n个元素.你可以做n-2次操作,每次操作去除一个数字,并且得到这个数字两边 ...

  2. Selenium

    Selenium可以抓取完整的页面的html但是request 和java的url不能抓的很完整. selenium的方法是dirver.page_source

  3. 在win server 2003上安装SQL Server 2008的步骤

    1.安装Microsoft .NET Framework 3.5 Service Pack 1,下载地址:http://www.microsoft.com/zh-cn/download/confirm ...

  4. 【Linux】依赖包检查

    参考:http://www.cnblogs.com/zc22/p/3197038.html ldd xx.so

  5. 使用虚幻引擎中的C++导论(一-生成C++类)

    使用虚幻引擎中的C++导论(一) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...

  6. java assert

    一.语法形式: Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion),它的 语法形式有如下所示的两种形式: 1.assert condition ...

  7. MC的一些具体的应用的例子的总结

    任何东西,都有其适用的场景,在合适的场景下,才能发挥好更大的作用. 对于memcached,使用内存来存取数据,一般情况下,速度比直接从数据库和文件系统读取要快的多. memcached的最常用的场景 ...

  8. JS中的for/in语句和arguments参数

    在js应用中,有时候我们会遇到希望定义一个函数可以被不同情况调用,比如参数个数不固定的情况. 可以使用for/in语句和arguments参数解决. 举个简单例子:定义一个计算总和的函数,需要计算的数 ...

  9. 抽象数据类型ADT

    ADT(Abstract Data Type) 类型由什么组成? 一个类型(type)指定两类信息,一个属性集和一个操作集. 假设要定义一个新的数据类型.首先,要提供存储数据的方式,可能是通过设计一个 ...

  10. DIOCP之数据接收事件

    一.不引用编码器与解码器的情况下(ECHO的DEMO) 类TIOCPtcpclient,接收服务器的数据事件:OnRecvBuffer 类TDiocpTcpServer,接收客户端数据事件:OnRec ...