【发布时间】:2015-01-06 00:18:43
【问题描述】:
我在我的 MSSQL 数据库中的一个表中添加了一个新的整数列,然后为该表的 Hibernate 实体相应地更新了 .hbm.xml 和 .java 文件。我可以看到我已经为我正在使用的给定行的列分配了一个“1”,但是我为该行返回的实体在其字段中有一个空值。
似乎更奇怪的是,在使用断点检查该字段的 getter 和 setter 的使用情况时,它们似乎在预期的时候接收并发送 1 ......尽管我创建了布尔帮助器方法(如果值为 0,则返回 false,如果为 1,则返回 true),将字段视为 null 并引发异常。即使在实体上调用了 setter 之后也会发生这种情况。
对为什么会发生这种情况有任何想法吗?我对 Hibernate 只是非常熟悉,但我怀疑这不是延迟加载问题,因为这是一个整数类型,而不是另一个实体。
编辑
这是我的 Hibernate 文件的相关部分。由于保密原因,我不能包含太多内容,但这应该足够通用。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 8-Sep-2011 3:31:37 PM by Hibernate Tools 3.2.4.GA -->
<hibernate-mapping>
<class name="net.company.EntityName" table="TableName" schema="dbo" catalog="database">
<id name="id" type="int">
<column name="TableNameId" />
<generator class="identity" />
</id>
...
<property name="cancelled" type="int">
<column name="Cancelled" />
</property>
<property name="cancelledOn" type="timestamp">
<column name="CancelledOn" length="23" />
</property>
<property name="cancelledBy" type="string">
<column name="CancelledBy" length="50" />
</property>
...
</class>
</hibernate-mapping>
public Integer getCancelled() {
return cancelled;
}
public void setCancelled(Integer cancelled) {
this.cancelled = cancelled;
}
public boolean isCancelled() {
return cancelled != null && cancelled == 1;
}
public Date getCancelledOn() {
return cancelledOn;
}
public void setCancelledOn(Date cancelledOn) {
this.cancelledOn = cancelledOn;
}
public void setCancelledBy(String cancelledBy) {
this.cancelledBy = cancelledBy;
}
public String getCancelledBy() {
return cancelledBy;
}
我认为这可能是由于 Dozer 行为不当,但以下是 dozer-mappings.xml 文件中与该实体相关的唯一映射:
<mapping>
<class-a>net.company.EntityName</class-a>
<class-b>net.company.EntityName</class-b>
</mapping>
【问题讨论】:
-
我会看看我能做什么,因为这是我雇主的产品。我不能照原样复制粘贴它。
-
boolean isCancelled 和 Integer getCancelled 代表相同的 Java Bean 属性“已取消”,我想它会以某种方式影响默认行为。您可以尝试将“isCancelled”重命名为“checkCancelled”只是为了检查这个理论,没有时间用测试来证明它)
-
@udalmik 确实是这样。我从来没想过要检查一下。随意添加它作为答案。
-
太棒了)我已经添加了答案