先放一下问题:
org.hibernate.NonUniqueObjectException
其实这个问题还是不常见的,至于他是怎么样产生的,我这个小菜鸟就不细说了,百度应该能够告诉你了。
百度翻译:具有相同标识符值的不同对象已与会话关联。
直接说我的情况:在使用spring+springMVC+hibernate的模式下写的一个项目。
在对其中的一个多对多关系表进行更新操作的时发生的报错。
修改之前hbm文件部分代码如下:(有错误的配置代码)
<set name="vipUser" table="som_link_market_user" inverse="false" lazy="false" cascade="all">
<key column="market_id"></key>
<many-to-many column="user_id" class="com.som.model.UserAccount"></many-to-many>
</set>
另外一个
<set name="vipMarket" table="som_link_market_user" inverse="true" lazy="false" cascade="all"> <key column="user_id"></key> <many-to-many column="market_id" class="com.som.model.MarketBasicInformation"></many-to-many> </set>
问题就在于set中那个cascade配置。但是这里两个多对多都配置了cascade,那是那个的问题呢?
我猜测对于我这个情况,应该是由于再次更新导致的,如果是这样的话我让进行维护关系的那个对象不再维护关系,应该也能够不报错的。即,第一个set配置中让inverse为TRUE,cascade为all(或者包含更新的配置也行)
本来上面这句话是我瞎写的,边写边测试着,然后就发现我的这个猜测是对的。就是因为维护关系的同时又进行了级联操作导致的错误。
所以现在这里有两种配置方式。就是维护关系的一方,不进行更新级联。不维护关系的一方,可以进行更新级联。这样对于多对多的关系表,应该是不会出现这样的错误了。
正确的两种配置方式:(是第一个set的修改版)
不维护关系,添加级联
<set name="vipUser" table="som_link_market_user" inverse="true" lazy="false" cascade="all"> <key column="market_id"></key> <many-to-many column="user_id" class="com.som.model.UserAccount"></many-to-many> </set>
维护关系,不级联
这两种方式都没有报错,且都完成了关系表中的添加。<set name="vipUser" table="som_link_market_user" inverse="false" lazy="false"> <key column="market_id"></key> <many-to-many column="user_id" class="com.som.model.UserAccount"></many-to-many> </set>
如果有哪里不对,欢迎指出。