2012-02-10 120 views
1

我有以下類:JPA XML映射找不到領域

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. 

該類位於作爲maven依賴項包含在Web應用程序中的jar中。 orm.xml位於Web應用程序的/ WEB-INF/classes/META-INF中。

我在做什麼錯?

回答

1

我自己想出了這個。出於某種原因,EclipseLink需要一個類的setter。一旦我添加私人套餐,一切似乎都很好。爲什麼需要setter(映射訪問器應該默認爲FIELD)仍然是一個謎,但它對我來說並不重要。將access =「FIELD」添加到所有實體屬性也可解決無setter的問題。

0

我認爲你必須爲ID列的列添加說明,而不是使用一個額外的基本元素添加到ID元素。如<id name="id"> <column name="vld_id" /> ... </id>,沒有額外的<basic name="id"> ...

根據我自己的經驗(前段時間現在),使用註釋來定義映射可能更容易。

+0

我試過在裏面加入標籤。但是,我無法刪除,因爲我需要eclipselink的標記(具有主鍵觸發器的舊DB設計),它不能放在之內。我仍然收到的結果。我知道註釋方法更容易,如果使用註釋,一切都可以正常工作。但是我不喜歡在我的域jar中對JPA的依賴。 – 2012-02-10 12:15:07

+0

如果您僅刪除基本測試,異常是否會消失? – Chris 2012-02-10 14:27:42

+0

即使我刪除了ID字段的,該例外仍然存在。 – 2012-02-10 21:31:34

1

你應該指定ID作爲使用標識策略生成:

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

這一戰略將自動讀取數據庫提供的ID回新對象在成功提交。 EclipseLink返回語句功能僅適用於基本映射,因爲身份標識生成已包含標識。

+0

僅當數據庫根據身份表生成主鍵時,此策略纔有效。但在我的情況下,底層數據庫是Oracle,它會在序列上生成主鍵。有由DBA設置的on-insert觸發器,它會爲您執行sequence.nextval。我知道還有一個基於序列的策略,但我沒有對序列(白癡數據庫管理員策略)的選擇權限,因此只能將返回插入作爲唯一選項。 – 2012-02-10 21:36:18