当前位置: 代码迷 >> Java Web开发 >> 表关联修改外键错误:identifier of an instance of Object was altered from 1 to 7
  详细解决方案

表关联修改外键错误:identifier of an instance of Object was altered from 1 to 7

热度:1137   发布时间:2016-04-16 21:27:24.0
表关联修改外键异常:identifier of an instance of Object was altered from 1 to 7
如一个对象为User,多对应一个组Guoup,当修改一个用户的Group时,出现identifier of an instance of Group was altered from 1 to 7异常。
出现这个异常的原因我大概知道,因为当修改一个User时,从数据库load了User实例,同时load了该User实例对应的Group实例,而对User修改其Group属性时,因对应Form中直接修改了其User.Group.Id属性值,而Group对象仍是原来load出来的对象,所以在save时,JPA不认为这是User更改了其Group对象,而是认为直接更改了该Group对象的Id值,所以就会出现identifier被更改的异常。我知道可用方法类似于再新建一个Group,赋新值,再将该Group赋值给User可实现,但现在就想问一下有没有其他办法,不新建Group,而在更改其属性User.Group.id的时候,只更改User的GroupId外键值而不去更改Group,因为本身这样才合理,我Save的是User,而User和Group之间又没设置级联操作,为什么一定要去Save一个Group呢?不理解,求教。
------解决思路----------------------
你使用的hibernate?如果是的话,就把主键方,配置文件中<one-to-mang>中一个属性是权利反转的属性,改为false
------解决思路----------------------
求解  一模一样的问题 
------解决思路----------------------
原因是缓存导致, 你需要在通过id回去Group前 clear()缓存就可以了。 因为在get前缓存中有Group的缓存对象或者是个没有加载数据的代理对象,而且这个对象呗form提交的数据修改了id,此时通过form传过来的id去get这个Group对象 则直接在缓存中找到了 所以在flush的时候就报修改id的错误了。
说好的50分哦 哥们!
------解决思路----------------------
是你*.hbm.xml映射文件中的属性 type类型设置的和你实例化java对象中的属性的类型不一致了  我今天晚上也遇到这个问题了  搞了好久才找出来的
------解决思路----------------------
请问解决了吗?是怎么解决的呢?
------解决思路----------------------
为何没有下文了呢
------解决思路----------------------
changeAuditDao.clear();
changeAuditDao.save(changeAudit);
------解决思路----------------------
第一次回复还有QQ表情啊!!我是参考书籍sql.sql先建表自增ID   AUTO_INCREMENT=30    我预先插入2-29(含头含尾)然后在hibernate程序里手动设置ID为1并添加到1的位置就报这个错误,希望给你做个参照  这回复符合程序员风格
  相关解决方案