JPA xml映射没有查找字段

时间:2012-02-10 11:23:12

标签: java jpa orm eclipselink

我有以下课程:

package lt.vic.valdos.domain.valda;

public class Valda implements java.io.Serializable {
    private long id;
    private Long valdosKodas;

    public long getId() {
        return id;
    }

    public Long getValdosKodas() {
        return valdosKodas;
    }
}

以及以下orm.xml:

<?xml version="1.0"?>
<entity-mappings
        xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/orm http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_1.xsd"
        version="2.1">
    <entity class="lt.vic.valdos.domain.valda.Valda">
        <table name="VALDOS" schema="VLD" />
        <attributes>
            <id name="id" />
            <basic name="id">
                <column name="vld_id" />
                <return-insert return-only="true" />
            </basic>
            <basic name="valdosKodas">
                <column name="valdos_kodas" />
            </basic>
        </attributes>
    </entity>
</entity-mappings>

当我在glassfish中部署它时,我收到以下错误:

Exception [EclipseLink-7215] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Could not load the field named [id] on the class [class lt.vic.valdos.domain.valda.Valda]. Ensure there is a corresponding field with that name defined on the class.

该类位于jar中,作为maven依赖项包含在Web应用程序中。 orm.xml位于Web应用程序的/ WEB-INF / classes / META-INF中。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

自己想出这个。出于某种原因,EclipseLink需要在类上设置setter。一旦我添加私人制定者一切似乎都很好。为什么需要setter(映射访问器应默认为FIELD)仍然是个谜,但对我来说并不重要。将access =“FIELD”添加到所有实体属性也可以在没有setter的情况下解决问题。

答案 1 :(得分:1)

您应该使用IDENTITY策略指定生成的ID:

<id name="id">
    <column name="vld_id"/>
    <generated-value strategy="IDENTITY"/>
</id>

此策略将在成功提交后自动将提供的数据库读回新对象。 EclipseLink返回语句功能仅适用于基本映射,因为身份ID生成已涵盖id。

答案 2 :(得分:0)

我认为你必须将id列的列描述添加到 id 元素,而不是使用额外的 basic 元素。与<id name="id"> <column name="vld_id" /> ... </id>中一样,没有额外的<basic name="id"> ...

根据我自己的经验(前一段时间),使用注释来定义映射可能更容易。