簡體   English   中英

Hibernate 4 composite-id NonUniqueObjectException

[英]Hibernate 4 composite-id NonUniqueObjectException

我將項目從Hibernate 3升級到Hibernate 4時拋出NonUniqueObjectException。我創建了最小的Hibernate 4項目用於測試目的,並設法通過以下方式重現此異常:

  • 擁有實體House,另一個實體具有包含House實體的復合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> 

  • 然后在同一個事務中獲取一個House,然后通過復合id獲取Door:

(門)session.get(Door.class,doorHousePK)

這是House的hbm文件:

<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)

當將這個最小的項目還原回Hibernate 3時,異常就消失了,一切正常。

Hibernate 3和Hibernate 4之間的復合id處理有什么區別? 如何在Hibernate 4中完成這項工作?

我最近從hibernate 3遷移到了4個帶有復合id的表,並且通過復合外鍵相互關聯。 完全相同的配置在兩個版本中都運行良好。 因此,就復合id功能的基本概念而言,沒有區別。

您應該為hibernate API啟用調試,即將org.hibernate。*的調試級別設置為日志屬性文件中的DEBUG,以查看正在觸發的SQL。 這將幫助您查看hibernate是否正在觸發任何其他/意外的SQL。

確保您的實體以及構成復合主鍵的對象具有hashCode()和equals()的適當實現。 我似乎記得Hibernate 3和4之間的哈希碼使用和/或對象相等性檢查存在一些潛在的變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM