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

  • 相关阅读:
    Java程序语言的后门-反射机制
    JAVA设计模式-单例模式(Singleton)线程安全与效率
    JAVA设计模式-动态代理(Proxy)源码分析
    Mybatis源码解析,一步一步从浅入深(七):执行查询
    Mybatis源码解析,一步一步从浅入深(六):映射代理类的获取
    python程序中的进程操作
    进程
    操作系统的发展史
    详尽实用的 PyCharm 教程
    python的socketserver模块实现TCP/UDP并发
  • 原文地址:https://www.cnblogs.com/lilyjia/p/3965467.html
Copyright © 2011-2022 走看看