因为时间关系,我在这里测试的环境是一对多的关系里面用到的注解方式的级联,网上也有很多贴子,我也看过了,但是呢,我还是自己总结一下吧,这觉得级联是单向的,不是双向的,意思就是说,我们在设置两个类的对象之间关系的时候,总是在一方设置的很具体,在另外一方设置一个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. hive基本操作

    hive级联删除数据库和表 drop database t1 cascade; hive创建临时表和插入 create table t1 as select * from achi; insert i ...

  2. [Linux]删除7天前的目录

    find /ftp_data/ -mindepth 2 -type d -mtime +7 -exec rm -rf {} \;

  3. Activity

    activity的生命周期: 第一个是:点击按钮切换到另一个activity界面. 第二个是:单击物理返回键的时候,是对当前的activity进行销毁动作. Activity的启动方式:直接启动和匿名 ...

  4. DEV中dx:ASPxPopupControl 控件的使用(在窗口关闭或隐藏时,清楚文本框中的内容)

    //在窗口关闭或隐藏时,清楚文本框中的内容(核心代码) function(s, e) { ASPxClientEdit.ClearGroup('entryGroup'); } <asp:Cont ...

  5. JavaScript基础篇

    写的不错,转 http://www.cnblogs.com/suoning/p/5656403.html

  6. appframework(jqmobi) 3.0 设置

    $(document).on("panelunload",'#mainPage',function(e){ alert('dddddd'); }); 1.重写 data-load ...

  7. 织梦(dedecms)系统常用全局变量调用标签及路径

    {dede:global.cfg_memberurl/} 指的是会员中心 对应/member/目录 {dede:global.cfg_cmsurl/} 对应的是网站根目录/ {dede:global. ...

  8. 【MySQL】MySQL 5.7 sys Schema

    sys库说明:http://dev.mysql.com/doc/refman/5.7/en/sys-schema-usage.html sys库使用说明:http://dev.mysql.com/do ...

  9. C++学习基础三——迭代器基础

    迭代器分为两种:一种是iterator,另一种是const_iterator.两者都可进行访问容器中的元素,不同之处是:(1)const_iterator类型只能用于读取容器内的元素,不能更改其值:而 ...

  10. Linux系统man查询命令等级及意义

    1:用户命令,可由任何人启动的 2:系统调用,由内核提供的函数 3:库函数 4:设备,/dev目录下的特殊文件 5:文件格式描述,例如/etc/passwd 6:游戏 7:杂项,例如宏命令包.惯例等 ...