2011-11-03 61 views
0

有一個帶有Hibernate ORM的Java SE項目。我覺得這個問題微不足道,但需要一些幫助。Hibernate - 訪問一對多關聯的子元素時的NullPointerException

有一個代碼段:

SessionFactory factory = new Configuration().configure().buildSessionFactory(); 

    Session s = factory.openSession(); 

    int id = 1; 

    ExperimentSetResult experimentSetResult = (ExperimentSetResult)s.get(ExperimentSetResult.class, id); 

    System.out.println("size: " + experimentSetResult.getExperimentResults().size()); 
    System.out.println("id[0]: " + experimentSetResult.getExperimentResults().get(0).getId()); 

我得到一個NullPointerException爲代碼的最後的字符串(訪問與最近裝入的對象相關聯的集合中的第0個元素時)。

有HBM的文件片段:

ExperimentResult.hbm.xml:

<hibernate-mapping> 
    <class name="rmocommon.driverreaction.ExperimentResult" table="experiment_results"> 
     <id name="id" type="int"> 
      <generator class="increment"/> 
     </id> 
     <many-to-one class="rmocommon.driverreaction.ExperimentSetResult" name="ExperimentSetResult" column="ExperimentSetResultId" not-null="true" /> 
    </class> 
</hibernate-mapping> 

ExperimentSetResult.hbm.xml:

<hibernate-mapping> 
    <class name="rmocommon.driverreaction.ExperimentSetResult" table="experiment_set_results"> 
     <id name="id" type="int"> 
      <generator class="increment"/> 
     </id> 

     <list name="ExperimentResults" cascade="all-delete-orphan" inverse="true"> 
      <key column="ExperimentSetResultId" not-null="true"/> 
      <list-index column="Id"/> 
      <one-to-many class="rmocommon.driverreaction.ExperimentResult"/> 
     </list>  
    </class> 
</hibernate-mapping> 

有什麼不對的映射或我的源代碼?

UPDATE: 這裏是一個輸出和堆棧跟蹤:

Hibernate: select experiment0_.id as id4_2_, experiment0_.StartedDate as StartedD2_4_2_, experiment0_.FinishedDate as Finished3_4_2_, experiment0_.DeviceOutput as DeviceOu4_4_2_, person1_.id as id0_0_, person1_.Login as Login0_0_, person1_.LastName as LastName0_0_, person1_.Patronymic as Patronymic0_0_, person1_.FirstName as FirstName0_0_, person1_.Age as Age0_0_, experiment2_.id as id1_1_, experiment2_.TestMode as TestMode1_1_, experiment2_.TransportType as Transpor3_1_1_, experiment2_.TransportStartSpeed as Transpor4_1_1_, experiment2_.RoadType as RoadType1_1_, experiment2_.RoadLength as RoadLength1_1_, experiment2_.DirectionLeft as Directio7_1_1_, experiment2_.RespondToFirstEffort as RespondT8_1_1_, experiment2_.SoundOnFirstEffort as SoundOnF9_1_1_, experiment2_.ScaleObjects as ScaleOb10_1_1_, experiment2_.ShowTransportSpeed as ShowTra11_1_1_, experiment2_.BarrierXMin as Barrier12_1_1_, experiment2_.BarrierXMax as Barrier13_1_1_, experiment2_.ReactionTime as Reactio14_1_1_, experiment2_.SoundOnBarrierAppearance as SoundOn15_1_1_, experiment2_.AllowedCheatCount as Allowed16_1_1_ from experiment_set_results experiment0_ left outer join persons person1_ on experiment0_.id=person1_.id left outer join experiment_set_settings experiment2_ on experiment0_.id=experiment2_.id where experiment0_.id=? 
Hibernate: select experiment0_.ExperimentSetResultId as Experim11_4_1_, experiment0_.id as id1_, experiment0_.Id as Id1_, experiment0_.id as id2_0_, experiment0_.Distance as Distance2_0_, experiment0_.Crash as Crash2_0_, experiment0_.BrakingStarted as BrakingS4_2_0_, experiment0_.BrakingStartedTime as BrakingS5_2_0_, experiment0_.BrakingStartedDistance as BrakingS6_2_0_, experiment0_.BarrierX as BarrierX2_0_, experiment0_.Number as Number2_0_, experiment0_.Time as Time2_0_, experiment0_.Valid as Valid2_0_, experiment0_.ExperimentSetResultId as Experim11_2_0_ from experiment_results experiment0_ where experiment0_.ExperimentSetResultId=? 
size: 6 
Exception in thread "main" java.lang.NullPointerException 
    at hibernateTest.HibernateTest.main(HibernateTest.java:45) 
Java Result: 1 
+0

您可以添加NPE的堆棧跟蹤嗎?還包括到那時爲止的輸出。 – salexander

+1

stak trace會有幫助,請檢查experimentSetResult/getExpresult是否爲null ..打印的大小是多少? –

+0

我剛剛添加了一個堆棧跟蹤,並有一個想法,打印的大小是錯誤的。相關聯的集合中實際上有5個元素。我測試過他們,第一個是空(爲什麼?),其他5個是實際值 –

回答

1

可能是你的映射是錯誤的。您的列表索引列definetly不應該是ID。 如果您確實需要訂購,最好爲此創建一個單獨的列,否則您會遇到問題。

我注意到的另一件事。您不必在一對多關係中指定逆。

這已經有一段時間了,我見過hbm.xml文件,你可以使用註釋嗎?他們更容易理解。

+0

我認爲你就在這裏,我剛剛有同樣的想法。將嘗試並返回結果。 你介意註釋更合適嗎?所有的hibernate例子都是用hbm.xml編寫的 –

+0

對列表項來說不是「inverse = true」足夠嗎? –

+0

註釋只是更容易掌握。他們更合乎邏輯和現代。 – WeMakeSoftware