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,我也进行了删除测试,删除的时候必须先查出来,然后才能进行级联删除,得出来的结论也是与上面的实验一样,在这里就不贴代码了。

时间: 2024-08-13 00:23:01

hibernate cascade=CascadeType.All的相关文章

hibernate 的 CascadeType 属性

hibernateintegerstringfloatclassmerge @Entity @Table(name="orders")public class Order { //1-m,多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端没有权利更新外键记录 private String orderid; private Float amount; private Set<OrderItem> items = new HashSet<OrderItem&

Hibernate学习一:Hibernate注解CascadeType

http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hibernate学习一:Hibernate注解CascadeType 博客分类: Hibernate hibernate 一.概念 现有一场景:一个管理员可以管理多个网吧,一个网吧可以被多个管理员管理.从中抽象出一个多对多的例子user-bar. 主控方user:多对多里面里面会有第三张表user_b

hibernate cascade

默认:none Cascade 属性值: none:在保存.删除修改对象的时候,不考虑其附属物的操作 save-update:在保存.更新当前对象时,级联保存.更新附属物. delete:在删除当前对象时,级联删除附属物. all: 包含save-update和delete的操作 delete-orphan:删除和当前对象解除关系的附属对象. NONE: <?xml version="1.0" encoding="utf-8"?><!DOCTYPE

Hibernate Cascade &amp; Inverse

Cascade - 修改实体表 Inverse - 修改中间表 http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html 1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在 cascade的源头上插入或是删除,所有cascade的关系就会被自己动的插入或是删除.便是为了能正确的cascade,unsaved- value是个很重

hibernate注解CascadeType

http://blog.csdn.net/strong8808/article/details/6318994(参考) CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法! CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据! CascadeType.MERGE:级联更新,当调用了Merge()方法,

spring+hibernate实体类注解详解(非原创) + cascade属性取值

@Entity //继承策略.另一个类继承本类,那么本类里的属性应用到另一个类中 @Inheritance(strategy = InheritanceType.JOINED ) @Table(name="INFOM_TESTRESULT") public class TestResult extends IdEntity{} 1 @Entity(name="EntityName") 必须 name为可选,对应数据库中一的个表 2 @Table(name="

Hibernate 一对一、一对多、多对多注解cascade属性的总结

作用:是否级联被注解字段里面的对象.可选值:javax.persistence.CascadeType.PERSIST, MERGE, REMOVE, REFRESH, DETACH, ALL.可选其中的一个或多个,选一个时,花括号可用可不用. PERSIST 级联session的persist操作.假设Student类和teachers字段的@ManyToMany注解上配置有cascade = {CascadeType.PERSIST},那么,当stu1对象set了一个teachers集合(这

再谈Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN

声明: 1.本文系原创,非抄袭或转载过来的. 2.本文论点都亲手做过实验论证. 3.本文所讲的Hibernate配置都基于注解的方式,hbm语法未提供. 非常多人对持久层概念搞不清JPA.Hibernate.EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和Hibernate是详细的实现类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的SessionAttribute跟Session B

Hibernate:deleted object would be re-saved by cascade (remove deleted object from associations): []

Hibernate多表关联的时候的异常:deleted object would be re-saved by cascade (remove deleted object from associations): []. [产生原因]表之间的一对多(多对一)关联,两种情况:双表一对多多对一,单表自关联一对多多对一.表现为:删除"多"的一方的条目的时候出现这个异常. [具体环境背景]楼主是在单表自关联(双向一对多多对一)出现的,建表细节: @Entity public class Dep