我继承了一些使用 Hibernate 的 Java 代码。一些使用此代码的人现在报告说他们到处都遇到 NullPointerExceptions。
我已经能够追踪到这一点,发现当我们执行一个从数据库中提取对象列表的查询时,该查询有一个对象列表(从不同的表中提取),Hibernate 似乎在数据库中留下了漏洞列表(NULL 值)。所以这个列表可能看起来像这样:
Object
Object
NULL
Object
我们用来从数据库中提取信息的代码是:
List<PrinterGroup> groups =
this.getSession().createQuery( "from PrinterGroup" ).list();
然后,每个 PrinterGroup 内部都有一个包含 NULL 值的过滤器列表。
虽然我可以四处寻找并找到每个实例,但我们循环遍历此列表并添加 NULL 检查,但我觉得这是一个创可贴修复,并且必须有一种方法告诉 Hibernate 不要拉入 null 值。
EDIT:
EDIT2:
所以数据库看起来很混乱。 PrinterGroup -> Filter 关系是一对多关系。因此 PrinterGroups 有一个过滤器列表。问题是过滤器列表在从数据库中出来时其中包含空值(顺便说一下,数据库中没有空值)并且列表看起来像上面一样。
EDIT3:
这是 PrinterGroup HBM 中的映射相关部分
<subclass name="PrinterGroup" discriminator-value="PG">
<list name="filters"
lazy="true"
table="PG_FILTER"
inverse="false"
cascade="all-delete-orphan">
<key>
<column name="PG_ID" not-null="false"/>
</key>
<index column="LISTPOSITION"/>
<one-to-many class="Filter"/>
</list>
Filter 是一个非常基本的 POJO 映射。
该集合是否映射了<list>(或其他索引集合)和<list-index>?
除了具有 set 和 bag 语义的集合映射之外,所有集合映射都需要集合表中的索引列。索引列是映射到数组索引、列表索引或映射键的列。 ...数组或列表的索引始终为整数类型,并使用元素进行映射。映射列包含默认从零开始编号的连续整数。
我可以想象,当使用索引集合时,如果您的索引列中有间隙(即它具有类似的值)0
, 1
, 3
, 7
)Hibernate 将填充结果List
在预期位置有空元素。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)