2014-01-30 60 views
0

我想添加一個嵌入式關係到一個實體類。JPA,可嵌入類

在我的數據庫中,我有表protein

+-------------------+------------------+------+-----+---------+----------------+ 

| Field    | Type    | Null | Key | Default | Extra   | 

+-------------------+------------------+------+-----+---------+----------------+ 

| PID    | int(11) unsigned | NO | PRI | NULL | auto_increment | 

| uniprot_UniprotAC | char(6)   | YES | MUL | NULL |    | 

| comment   | int(11) unsigned | YES | MUL | NULL |    | 

+-------------------+------------------+------+-----+---------+----------------+ 

和表benchmark

+-----------------+--------------------------------+------+-----+---------+-------+ 
| Field   | Type       | Null | Key | Default | Extra | 
+-----------------+--------------------------------+------+-----+---------+-------+ 
| ba_type   | varchar(255)     | YES |  | NULL |  | 

| target   | int(11) unsigned    | NO | MUL | NULL |  | 

| rec_diluation | varchar(255)     | YES |  | NULL |  | 

| comment   | text       | YES |  | NULL |  | 
+-----------------+--------------------------------+------+-----+---------+-------+ 

benchmark領域的目標是爲protein

我已經有一個外鍵一個名爲SupProtein的實體可以從蛋白質表中正常工作。

現在我想添加一個嵌入關係到Benchmark類。

這是我的標杆類:

import java.io.Serializable; 
import javax.persistence.Column; 
import javax.persistence.Embeddable; 

@Embeddable 
public class Benchmark implements Serializable { 
    @Column(name="ba_type") 
    private String type; 
    @Column(name="comment") 
    private String comment; 
    @Column(name="recDilution") 
    private String recDilution; 

    public Benchmark(){ 

    } 

     public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public String getComment() { 
     return comment; 
    } 

    public void setComment(String comment) { 
     this.comment = comment; 
    } 

    public String getRecDilution() { 
     return recDilution; 
    } 

    public void setRecDilution(String recDilution) { 
     this.recDilution = recDilution; 
    } 

} 

在我entityt類SupProtein我補充一下:

@Embedded 
private Benchmark benchmark; 

但是當我嘗試建立我得到以下錯誤:

Internal Exception: Exception [EclipseLink-7246] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: The Entity class [class SupEntity.SupProtein] has an embedded attribute [benchmark] of type [class Benchmark] which is NOT an Embeddable class. Probable reason: missing @Embeddable or missing <embeddable> in orm.xml if metadata-complete = true 

我還沒有創建任何ORM.xml文件,並找不到任何地方。我需要一個orm.xml文件來創建可嵌入的關係,或者可能是我的問題?

+0

你可能不使用你認爲你正在使用的Benchmark類的基數。但Embeddable不適合使用。您應該有一個OneToOne關聯。基準測試的領域並不像蛋白質的領域那樣嵌入在同一個表格中。 –

+0

我真的可以使用OneToOne關聯嗎,這並不意味着我必須將基準作爲實體嗎?並且實體不必擁有一個id,並且與實體相對應的表必須具有主鍵? (基準表沒有)基準表的字段與蛋白質字段沒有嵌入在同一張表中。你是什麼意思? – numfar

回答

0

Now I want to add an embedded relation to a Benchmark class.

我覺得你有錯誤的觀念:

The @Embedded annotation is used to specify a persistent field or property of an entity whose value is an instance of an embeddable class. By default, column definitions specified in the @Embeddable class apply to the table of the owning entity

嵌入式類不是實體,而不是在表中。 如果基準是一個表,您必須在類上使用@Entity註釋。 只有當一個類的某些屬性可以被當作一個對象時纔可以使用。

我需要一個orm.xml文件來創建可嵌入的關係,或者可能是我的問題? 不,orm.xml不是必需的,不是爲此目的。

如果你想擁有類之間的關係,你應該使用@OneToOne,@OneToMany取決於你們的關係

+0

但在基準表中沒有主鍵,對我而言,似乎我需要類中的id字段以使其成爲實體。這就是爲什麼我認爲我需要使它成爲Embeddable類而不是實體。 – numfar