Java Hibernate-访问一对多关联的子元素时的NullPointerException

Java Hibernate-访问一对多关联的子元素时的NullPointerException,java,hibernate,Java,Hibernate,有一个带有Hibernate ORM的JavaSE项目。我觉得这个问题很小,但需要一些帮助 有一段代码片段: SessionFactory factory = new Configuration().configure().buildSessionFactory(); Session s = factory.openSession(); int id = 1; ExperimentSetResult experimentSetResult = (Experi

有一个带有Hibernate ORM的JavaSE项目。我觉得这个问题很小,但需要一些帮助

有一段代码片段:

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

可能是您的映射错误。列表索引列不应为ID。 如果您真的需要排序,最好为此创建一个单独的列,否则会遇到问题

还有一件事我注意到了。您不必在一对多关系上指定反向


有一段时间我看到了hbm.xml文件,你能使用注释吗?它们更容易理解。

您可以添加NPE的stacktrace吗?还包括到该点的输出。stak跟踪会很有帮助,检查experimentSetResult/getExpresult是否为null。。打印的尺寸是多少?我刚刚添加了堆栈跟踪,发现打印的尺寸不对。一个关联的集合中实际上有5个元素。我已经测试过了。。。第一个是空值(为什么?),另外5个是实际值我想你就在这里,我也有同样的想法。将尝试并返回结果。你介意注释更合适吗?所有hibernate示例都是用hbm.xml编写的。列表项的“inverse=true”还不够吗?注释更容易掌握。它们更具逻辑性和现代性。
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