我有以下课程:
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中。
我做错了什么?
答案 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"> ...
。
根据我自己的经验(前一段时间),使用注释来定义映射可能更容易。