问题描述
在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语句,而实际上两边发出的语句是一样的,这样就违反了唯一性,就报错了