2011-11-03 62 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