Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate 4复合id非唯一性ObjectException_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java Hibernate 4复合id非唯一性ObjectException

Java Hibernate 4复合id非唯一性ObjectException,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我在将项目从Hibernate 3升级到Hibernate 4时引发了UnonqueObjectException。 出于测试目的,我创建了Minimum Hibernate 4项目,并通过以下方式复制了此异常: 具有实体房屋,以及具有包含房屋实体的复合id的另一个实体门 <class dynamic-insert="true" dynamic-update="true" name="entity.Door" select-before-update="true" table="DOOR

我在将项目从Hibernate 3升级到Hibernate 4时引发了UnonqueObjectException。 出于测试目的,我创建了Minimum Hibernate 4项目,并通过以下方式复制了此异常:

  • 具有实体房屋,以及具有包含房屋实体的复合id的另一个实体门

    <class dynamic-insert="true" dynamic-update="true" name="entity.Door" select-before-update="true" table="DOOR">
    <composite-id name="id" class="DoorHousePK">
        <key-many-to-one class="entity.House" column="HOUSEID" name="house"/>
        <key-property column="DOORID" name="doorId" type="string"/>
    </composite-id>
    
    当将这个最小的项目恢复到Hibernate3时,异常就消失了,并且一切正常

    Hibernate 3和Hibernate 4在复合id处理方面有什么不同?
    如何在Hibernate 4中实现这一点?

    我最近从Hibernate 3迁移到了Hibernate 4,使用了两个具有复合ID的表,并通过复合外键相互关联。完全相同的配置在两个版本中都可以正常工作。因此,就复合id功能的基本概念而言,没有区别


    您应该为hibernate API启用调试,即为org.hibernate.*设置调试级别,以便在日志属性文件中进行调试,以查看触发了哪些SQL。这将帮助您查看hibernate是否触发了任何其他/意外的SQL。

    确保您的实体以及构成复合主键的对象具有hashCode()和equals()的适当实现。我似乎记得Hibernate 3和4之间的哈希代码使用和/或对象相等性检查有一些潜在的变化。

    我将min project附加到了这张票据上,当在Hibernate 3和4之间切换时,这个问题在这个最小的项目中重现。这是min project的附件。我看了你的代码。您正在加载两次具有相同id的父对象。先在Hib4Min.java主方法中,然后在ChildService的ReplicateNonuniqueObjectException方法中。您可以安全地注释掉后一个调用(在ChildService.java中),因为您不需要它。若您需要父对象,可以从ChildParentPK的getParent方法中获取。一旦注释掉这个调用,代码就会正常运行。我还没有尝试在hibernate 3中运行。实际上,导致问题的是ChildService的ReplicateNonuniqueObjectException中的两个调用:-getParentById和-getChildById。getParentById的第一个调用与问题无关。问题是这两个调用在同一事务中。在我的项目代码中也有类似的情况,我们在同一事务中得到父对象,然后得到子对象。这在Hibernate 3中工作,在Hibernate 4中不工作。所以我想知道为什么它在Hibernate3中工作,而在Hibernate4中抛出异常。
    <class dynamic-insert="true" dynamic-update="true" name="entity.House" select-before-update="true" table="HOUSE">
            <id column="ID" name="id" type="int"/>
            <property column="squarefeet" name="squareFeet" not-null="false" type="int"/>
            <property column="address" length="255" name="address" not-null="false" type="string"/>
            <property column="color" length="32" name="color" not-null="false" type="string"/>
            <property column="description" name="description" not-null="false" type="materialized_clob"/>
        </class>
    
    INFO: HHH000327: Error performing load command : org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [entity.House#1]
    Exception in thread "main" org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [entity.House#1]
        at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:617)
        at org.hibernate.event.internal.AbstractReassociateEventListener.reassociate(AbstractReassociateEventListener.java:74)
        at org.hibernate.event.internal.DefaultLockEventListener.onLock(DefaultLockEventListener.java:95)
        at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:774)
        at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:767)
        at org.hibernate.internal.SessionImpl.access$1800(SessionImpl.java:176)
        at org.hibernate.internal.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2491)
        at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.addKeyManyToOnesToSession(EntityLoadQueryDetails.java:263)
        at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.readRow(EntityLoadQueryDetails.java:247)
        at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:129)
        at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:138)
        at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:102)
        at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:186)
        at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4126)
        at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:503)
        at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:468)
        at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:213)
        at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:275)
        at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:151)
        at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1070)
        at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:176)
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2551)
        at org.hibernate.internal.SessionImpl.get(SessionImpl.java:955)