当前位置:编程学习 > JAVA >>

表关联修改外键异常: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 --------------------编程问答--------------------
引用 1 楼  的回复:
你使用的hibernate?如果是的话,就把主键方,配置文件中<one-to-mang>中一个属性是权利反转的属性,改为false

我用的是jpa,我搜了下在JPA中是以mappedBy来表示维护端的,而我不管配置不配置OneToMany(有没有mappedBy),都是这样的错误。 --------------------编程问答-------------------- 请高手解答啊,急等。 --------------------编程问答-------------------- 没有合适的做法,只好在修改的时候在新建一个外键对象然后传给要修改的对象。还是希望有人能有更好的做法。 --------------------编程问答-------------------- 求解  一模一样的问题  --------------------编程问答-------------------- 原因是缓存导致, 你需要在通过id回去Group前 clear()缓存就可以了。 因为在get前缓存中有Group的缓存对象或者是个没有加载数据的代理对象,而且这个对象呗form提交的数据修改了id,此时通过form传过来的id去get这个Group对象 则直接在缓存中找到了 所以在flush的时候就报修改id的错误了。
说好的50分哦 哥们! --------------------编程问答--------------------
引用 6 楼 xmlpjw 的回复:
原因是缓存导致, 你需要在通过id回去Group前 clear()缓存就可以了。 因为在get前缓存中有Group的缓存对象或者是个没有加载数据的代理对象,而且这个对象呗form提交的数据修改了id,此时通过form传过来的id去get这个Group对象 则直接在缓存中找到了 所以在flush的时候就报修改id的错误了。
说好的50分哦 哥们!


你说的clear缓存在什么地方执行?能否提供一段代码?五十分肯定给的了,不要着急。 --------------------编程问答-------------------- 是你*.hbm.xml映射文件中的属性 type类型设置的和你实例化java对象中的属性的类型不一致了  我今天晚上也遇到这个问题了  搞了好久才找出来的
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,