2013-03-15 67 views
0

我觀察到Hibernate的奇怪行爲。Hibernate的bug?錯誤處理結果列,查詢數據庫不存在ID

我有一個實體圖形在JPA/JPQL: Fill a collection/map based on related object's collection/map? (prototype-like)

描述然後我查詢這種模式:

this.em.createQuery("SELECT rel FROM Release rel " 
      + " LEFT JOIN FETCH rel.product pr " 
      + " LEFT JOIN FETCH pr.customFields " 
      + " LEFT JOIN FETCH rel.customFields " 
      + (withDeps ? " LEFT JOIN FETCH rel.deps" : "") 
      + " WHERE rel.product.name = ?1 AND rel.version = ?2", Release.class) 
      .setParameter(1, prodName) 
      .setParameter(2, version) 
      .getSingleResult(); 

休眠轉換到這兩個查詢:

select release0_.id as rel, product1_.id as prod, customfiel2_.id as prodCF, customfiel3_.id as relCF, 
release0_.product_id as rel_prod, ... 
from `release` release0_ 
left outer join product product1_ on release0_.product_id=product1_.id 
left outer join prod_custField customfiel2_ on product1_.id=customfiel2_.product_id 
left outer join rel_custField customfiel3_ on release0_.id=customfiel3_.release_id 
cross join product product4_ 
where release0_.product_id=product4_.id and product4_.name='EAP' and release0_.version='6.0.1.GA' 

它返回

「 1','1','3','2','1','4',...

然後

select productcus0_.id as id59_0_, productcus0_.label as label59_0_, productcus0_.name as name59_0_ from prod_custField productcus0_ where productcus0_.id=1; 

的問題是,Hibernate的負載ProductCustomField ID爲「1」,這是一個錯誤 - 因爲沒有返回的列是指PCF;有一個與ReleaseCustomField相對應的ID「1」。

這裏的結果減去不相關的文本字段:

{ 
    'rel' : 1, 
    'prod' : 1, 
    'prodCF' : 3, 
    'relCF' : 2, 
    'rel_prodid' : 1, 
    'status' : 4, 
    'prodCFname' : 'jarRpmLic', 
    'prodCF_prodid' : 1, 
    'prodCF_id' : 3, 
    'prodCF_name' : 'jarRpmLic', 
    'relCF_id' : 1, 
    'relCF_name' : 'eapCustField1', 
    'relCF_relid' : 1, 
    'relCF_val' : 'wdqdwqwdqd', 
    'relCF_relID' : 1, 
    'relCF_id' : 2, 
    'relCF_name' : 'eapCustField1' 
} 

正如你所看到的,可用於ProductCustomField唯一的價值是3

這是一個錯誤?我應該如何驗證?解決方法是什麼?我考慮使用一些特定於Hibernate的@Fetch策略,或部分保溼實體並通過另一個DAO調用手動加載其他集合。

堆棧跟蹤:

javax.persistence.EntityNotFoundException: Unable to find org.jboss.essc.web.model.ProductCustomField with id 1 
at org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:155) 
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:210) 
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:260) 
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148) 
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1079) 
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1006) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:613) 
at org.hibernate.type.EntityType.resolve(EntityType.java:441) 
at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:168) 
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:134) 
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:999) 
at org.hibernate.loader.Loader.doQuery(Loader.java:878) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293) 
at org.hibernate.loader.Loader.doList(Loader.java:2382) 
at org.hibernate.loader.Loader.doList(Loader.java:2368) 
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2198) 
at org.hibernate.loader.Loader.list(Loader.java:2193) 
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) 
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) 
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1248) 
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 
at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:285) 

回答

0

原來由HHH-6361和HHH-7928引起的,我忽略了不一致的數據。 我依靠FK限制會警告我,但是特定的一個不見了。合併分離實體進入persistencecontext後

HHH-6361 

收集事件可能包含錯誤的存儲快照