hibernate cascade=CascadeType.All
因为时间关系,我在这里测试的环境是一对多的关系里面用到的注解方式的级联,网上也有很多贴子,我也看过了,但是呢,我还是自己总结一下吧,这觉得级联是单向的,不是双向的,意思就是说,我们在设置两个类的对象之间关系的时候,总是在一方设置的很具体,在另外一方设置一个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的更多相关文章
- 转Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))
一:Group和Users两个类 假定一个组里有n多用户,但是一个用户只对应一个用户组. 1.所以Group对于Users是“一对多”的关联关系@OneToMany Users对于Group是“多对一 ...
- hibernate CasCade deleted object ould be re-saved by cascade
这个问题个人认为看你用的那种方式,如果是注解式的 比如: @ManyToMany(cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType. ...
- hibernate cascade的真正含义
hibernate cascade 是 @OneToOne @OneToMany @ManyToOne @ManyToMany等注解的属性,表示级联操作. /** * (Optional) The o ...
- hibernate 的 CascadeType 属性
hibernateintegerstringfloatclassmerge @Entity @Table(name="orders")public class Order { // ...
- Hibernate学习一:Hibernate注解CascadeType
http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hi ...
- Hibernate Cascade & Inverse
Cascade - 修改实体表 Inverse - 修改中间表 http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html 1.到底在 ...
- Hibernate cascade级联
cascade: 级联: 是对象的连锁操作 级联保存(一对多): 级联保存: 当保存双向关系的一方时,默认会报告错误,此时应该在customr中设置级联保存,即操作一个对象时,通过操作其他关联对象 如 ...
- hibernate cascade
默认:none Cascade 属性值: none:在保存.删除修改对象的时候,不考虑其附属物的操作 save-update:在保存.更新当前对象时,级联保存.更新附属物. delete:在删除当前对 ...
- hibernate注解CascadeType
http://blog.csdn.net/strong8808/article/details/6318994(参考) CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体, ...
随机推荐
- 29. Populating Next Right Pointers in Each Node && Populating Next Right Pointers in Each Node II
Populating Next Right Pointers in Each Node OJ: https://oj.leetcode.com/problems/populating-next-rig ...
- [oracle] update和merge语句的几点写法
1.update t2 set parentid=(select ownerid from t1 where t1.id=t2.id); 2. update tb_client_win_lost_re ...
- java三大框架之一hibernate使用入门
综述:Hibernate的作用就是让实体类与数据库映射,使数据持久化,用于替代JDBC,使我们不致于写那么多sql语句代码. 1. 首先在官网www.hibernate.org下载hibernate包 ...
- MSSQLSERVER之发布-分发-订阅
一.环境 发布服务器 O S: Windows servier 2003 64位 Soft: Microsoft SqlServer 2008 R2 I P: 192.168.3.70 HOST-NA ...
- struts2 xml中重定向
<result name="success" type="redirect">ManagePartAction</result> 重定向 ...
- TIJ读书笔记05-this关键字
TIJ读书笔记05-this关键字 概述 this的用法 static方法 概述 两个对象同时调用一个方法,那么jvm怎么知道是哪个方法调用的呢. 我们在书写的时候会写成a.fun(1) 或者b.fu ...
- VMware学习笔记(一)
vmware核心产品是vSphere,而vSphere主要包括ESXi和vCenterServer. ESXi不依赖其它操作系统OS,安装在每一台物理机上,ESXi是免费的.在ESXi主机上再安装vS ...
- webstorm下搭建编译less环境
webstorm自带less,不过要编译的话需要nodejs环境. 首先去node的主页下载对应版本的nodejs然后安装,下载地址:http://nodejs.org/ 安装完之后打开命令提示符(w ...
- Spring----->projects----->Spring Security
1.Spring Security概述 Spring Security是spring社区若干projects中的一个 Spring Security用于为基于spring开发的application提 ...
- 退役?OR 继续
今天突然想了好多.上次CB那么决绝的退役,还有其他的一些东西.觉得大家说的都挺对的.看待问题的方式不同,然后或多或少就变了.预备役的事情就是想能不能不让大家因为上不了场退役. 想起以前的自己那么坚决的 ...