Hibernate(JPA)多对多(ManyToMany)关联映射不完美之处

近来,在做的一个NewsMS项目中,需要用到多对多关联映射,以下是项目中用到的两个实体类:用户类User和角色类Role,它们之间是多对多的关系。

//用户表
@Entity
@Table(name="rong_user")
public class User{

    //省略其它内容

    private Set<Role> roles = new LinkedHashSet<Role>();    //角色集合
   
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name = "rong_user_role", joinColumns = { @JoinColumn(name ="user_id" )}, inverseJoinColumns = { @JoinColumn(name = "role_id") })
    @OrderBy("id")
    public Set<Role> getRoles() {
        return roles;
    }
    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}
//角色表
@Entity
@Table(name="rong_role")
public class Role{
   
    //省略其它内容

    private Set<User> user = new LinkedHashSet<User>();        //用户集合

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "roles", fetch = FetchType.LAZY)
    public Set<User> getUser() {
        return user;
    }
    public void setUser(Set<User> user) {
        this.user = user;
    }
}

这两个生成数据库中的三个表,分别是rong_user, rong_role和一个中间表rong_user_role。

Hibernate和JPA控制关联关系的,只能是一方,不能双方控制的,上面的程序中,我通过在Role类中设置mappedBy="roles"来设置由User来控制关系,

这样,问题就出现了:当我在要删除角色Role时,如果没有用户拥有这个角色的话,就能成功删除;如果有用户拥有这个角色的时候,就不能删除,会抛以下异常:

12:53:33,125  WARN JDBCExceptionReporter:100 - SQL Error: 1451, SQLState: 23000

12:53:33,125 ERROR JDBCExceptionReporter:101 - Cannot delete or update a parent row: a foreign key constraint fails (`newsms/rong_user_role`, CONSTRAINT `FKF1698421A337A5FA` FOREIGN KEY (`role_id`) REFERENCES `rong_role` (`id`))

12:53:33,171 ERROR AbstractFlushingEventListener:324 - Could not synchronize database state with session

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索多对多
, mappedby
, 用户
, public
, hibernate 多对多 jpa
, name
, 角色
, role
, manytomany
user
hibernate 关联映射、hibernate的关联映射、jpa manytomany、jpa manytomany 查询、jpa manytomany 保存,以便于您获取更多的相关知识。

时间: 2024-09-29 20:23:20

Hibernate(JPA)多对多(ManyToMany)关联映射不完美之处的相关文章

Hibernate从入门到精通(十一)多对多双向关联映射

上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我 们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一下相关类图和代码,具体如下: public class Role { private int id; private String name; private Set users; public int getId() { return id; } public void setId(int id

Hibernate从入门到精通(十)多对多单向关联映射

上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的 相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映 射之前,首先看一下相关类图和代码,具体如下: public class Role { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id;

Hibernate学习(四)多对一单向关联映射

Hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的.一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它. 今天就来说说多对一的关联映射. 数据库中有多对一的关系,Hibernate自然也有对象的多对一的关联关系.比如用户和用户组,一个用户只属于一个组,一个组有多名用户.我们就可以说用户和用户组的关系就是多对一的关系.用对象的uml图表示一下: 在Hibernate中如何来实现呢?首先定义这两个实体类: pac

Hibernate从入门到精通(七)多对一单向关联映射

上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本 次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类 似,只是在多对一的指向端可以存在多个对象,在指向端加载的时候,同时加载被指向端. 多对一和 一对一的异同 对比一对一单向关联映射和多对一单向关联映射,两者的相同之处在于在指向端被加载 的时候,指向端会被一起加载进来,这一点从如下类的结构图和代码中看出.(以下只给出多对一相关图示和 代码,一对一图示和代码参考

【SSH系列】Hibernate映射-- 多对一单向关联映射

      在hibernate中非常重要的就是映射,在前面的博文中,小编简单的介绍了基本映射,基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用.这个比较简单,但是基础知识还是需要好好掌握的哦,还有一些关联映射,比如user && group,她们之间的关系是一对多,我们知道一个用户只能属于一个组,但是一个组可以包好N多个用户,所以他们之间的关系就是多对一的关系,接着我们来看他们的对象模型以及关系模式.

一口一口吃掉Hibernate(四)——多对一单向关联映射

      Hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的.一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它.       今天就来说说多对一的关联映射.       数据库中有多对一的关系,Hibernate自然也有对象的多对一的关联关系.比如用户和用户组,一个用户只属于一个组,一个组有多名用户.我们就可以说用户和用户组的关系就是多对一的关系.用对象的uml图表示一下:       在Hibernat

Hibernate框架学习之四:关联映射那些事

前言 Hibernate关联关系与客观世界中具体的映射关系很类似,在进行数据库设计的时候常常需要考虑是一对多.多对一等类似的映射关系,这其中涉及数据库设计方面的知识.映射关系可以分为单向与双向两种,具体又包括一对多.多对一.一对一以及多对多四种.所以总共有八种映射关系.这里只介绍了XML配置文件的版本. 下面的配置文件的配置方式都以下面的两个持久化类作为模板: public class Person { private int id; private String name; private i

深入解析Java的Hibernate框架中的一对一关联映射_java

作为一个ORM框架,hibernate肯定也需要满足我们实现表与表之间进行关联的需要.hibernate在关联方法的实现很简单.下面我们先来看看一对一的做法:  不多说了,我们直接上代码:  两个实体类,TUser和TPassport: public class TUser implements Serializable{ private static final long serialVersionUID = 1L; private int id; private int age; priva

【SSH系列】Hibernate映射 -- 多对多关联映射

     映射原理         在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张表中做一个关联,用第三张表来解决可能造成的数据冗余问题.今天这篇博文小编来简单的介绍一下hibernate中的多对多关联映射.        在某些系统中,一个用户可以有多个角色,一个角色也可以有多个用户,so,她们之