many-to-many的双向关联中两边都设置inverse="false",到底可以么

问题描述

在hibernate的双向关联中,两边都设置inverse="false"可以么?看到论坛有的大神说一定要设置一遍的inverse="true":“为什么在多对多中不能由双方都来维护关系了:因为这样会导致重复更新中间表的可能,报出重复值的错误。”有哪位大神能详细解释下么? 问题补充:finallygo 写道

解决方案

嗯,是的,因为这样更符合逻辑,比如你开启了二级缓存,而你想查看有多少人是属于某一个职业的,正常来说你会通过get来获取Job,而如果你没有添加的话,那就到的是空的,这个是不符合实际的
解决方案二:
嗯,是这样的,因为inverse维护的只是关系,你的job如果没有添加person的话,那它就不知道要插入一条新的记录来维护这个关系了,你只要知道hibernate的实现原理,理解这个就容易了
解决方案三:
我的意思是像这样的话,在两边都inverse的情况下,会报错 Role role1=new Role();role1.setName("role1");Role role2=new Role();role2.setName("role2");User user1=new User();user1.setName("user1");user1.getRoles().add(role1);user1.getRoles().add(role2);role1.getUsers().add(user1);Session session=HibernateSessionFactory.getSession();session.beginTransaction();session.save(user1);session.save(role1);session.getTransaction().commit();session.close();
解决方案四:
你想一下,按照我们正常的逻辑,person底下有多个job了,那job底下也应该有多个person了啊,所以如果如果按正常的逻辑来做的话,就可能出问题了,所以为了避免这个问题,把一方设置为true了,总之我觉得这个问题的产生还是因为对象与关系型数据库之间一些思想上的不一致导致的吧
解决方案五:
可是你的job没有add person啊
解决方案六:
指的是,在多对多的情况下,中间表由hibernate来维护的时候会出现这个问题,如果两边都设置了false的话,两边的实体对象的Set集合发生添加(互相添加对方)的时候,都会执行insert语句,而实际上两边发出的语句是一样的,这样就违反了唯一性,就报错了

时间: 2025-01-21 03:06:31

many-to-many的双向关联中两边都设置inverse="false",到底可以么的相关文章

Hibernate中双向关联加载排序的解决方案

问题:Hibernate的<many-to-many>双向关联中,一方加载另一方时,怎么样达到按自定义规则排序的目的呢? 实例:角色和菜单是多对多的关系,为角色分配菜单后,加载菜单时,我需要按照菜单的ID来排序显示. 解决办法: 1. 通过在hbm配置文件中配置解决,需要自定义比较器. 1) 在多对多的主控端指定sort属性 这里的主控端为role,受控端为menu. role的配置为: <set name="roleMenus" table="ROLE_M

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

在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同的的是在一对一双向关联中,不但在一个对象(Person)中存在另一个对象(IdCard)的引用,而在另一 个对象(IdCard)中也存在对该对象(Person)的引用,这样即可以在加载该对象(Person)的时候找到另一个对象 (IdCard),也可以在加载另一个对象(IdCard)的时候找到该对象

hibernate-Hibernate中双向关联和单向关联的意思是什么?

问题描述 Hibernate中双向关联和单向关联的意思是什么? 有老师,学生两个bean, 双向关联就是需要在两个bean的xml文件中都写入关系,例如many to many 单项关联只需要在老师的一方或者学生的一方的配置文件中写入关系即可使用,例如one to many或者many to one 解决方案 这个是关系型数据库中实体之间的关系 1对1 1对多 多对1 多对多 其中的多对多要进行拆分,拆成1对多和多对1 关系的描述就是如何去设置这个主键和外键 1对多的关系可以描述为一个表中有2个

Java的Hibernate框架中一对多的单向和双向关联映射_java

一.一对多单向关联映射 一对多关系的对象模型在日常生活中也经常看到,就拿学生和班级来说,一个班级里有多个学生,所以班级和学生的关系是一对多的关系,映射到对象模型中,如下图: 对象模型说明了这种一对多的关系是由一的一端来维护的,那么映射成关系模型就是一个班级字段下面会有多个学生,这样就形成了一对多的关系,通过班级能够查询获得学生信息,对应的关系模型如下图: 1.基本配置 有了对象模型接下来就让它们映射为对应的关系代码,在进行关系映射时需要在一的一端添加<one-to-many>标签,另外还需要在

java中Hibernate多对多双向关联的配置

 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任  Hibernate的双向多对多关联有两种配置方法:那我们就来看看两种方案是如何配置的.          一.创建以各自类为类型的集合来关联       1.首先我们要在两个实体类(雇员<Emploee>.工程<Project>)中各自给对方添

hibernate-Java双向关联的一个纠结问题

问题描述 Java双向关联的一个纠结问题 在实体中例如一对多,我们Java使用关系型数据库当然希望双相关联.这样就会出现以下的问题: 使用hibernate配置实体关联的时候有一个属性叫做lazy,这个属性告诉hibernate有关联关系的时候,我是不是需要懒加载.如果lazy是true,很多人都会遇到这样的问题:no session,当然,no session有解决方案:使用配置让session延时关闭,但是这样对项目的性能显然是有影响的,会造成连接池拥挤,我们先暂时不使用这种比较笨的方式.至

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

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

hibernate5(11)注解映射[3]一对多多对一双向关联

在上两篇文章里,我们详细地分别讲解了一对多和多对一的单向关联配置的具体属性含义,在这一篇文章里,我们完成两者的的整合建立双向关联. 在实际的博客网站中,我们可能需要根据文章读取作者(用户)信息,但肯定也要让用户能获取自己的文章信息,针对这种需求,我们可以建立文章(多)对用户(一)的双向关联映射. 下面先看实例映射配置文件: /********************一方配置User********************/ @Entity//声明当前类为hibernate映射到数据库中的实体类

【SSH系列】hibernate映射 -- 一对一双向关联映射

       开篇前言       上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.为什么呢,因为对象模型具有方向性,在前面的博文Hibernate基本映射中,小编介绍了单向和双向,所谓的单向就是一段只能加载另一个端,不能反过来:双向就是两端都可以加载另一端,可以这样来理解,单向就是一厢情愿,双向就是两情相悦.ok,那么问题来了,如果我