为什么我的Hibernate实体中的字段为空?

时间:2014-11-09 17:46:08

标签: java hibernate dozer

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

1 个答案:

答案 0 :(得分:1)

两个

boolean isCancelled()

Integer getCancelled()

代表同一财产的访问者&#34;取消&#34;就Java Beans spec而言,它可以打破Hibernate的属性发现逻辑。请尝试将布尔实用程序方法重命名为其他名称,例如:

boolean checkCancelled()