2013-09-23 32 views
0

我花了一些時間搜索,但沒有收到滿意的結果。包含兩種相同類型的複合鍵

我的類別是:

Listener, ListenerPK 
Actuator, ActuatorPK 
DeviceState, DeviceStatePK 

其中ListenerPK包含DeviceStatePK和String的實例,並ActuatorPK包含ListenerPK的實例,並DeviceStatePK的一個實例。

所以執行器包含一個監聽器和一個DeviceState(都標記爲@Id,@ManyToOne),監聽器包含一個DeviceState和一個字符串(@Id,@ManyToOne)。

我的問題是,在JPA,我這樣做時,我得到一個異常如下:

異常說明:該字段XXX存在多個可寫的映射。只有一個可以被定義爲可寫,所有其他都必須被指定爲只讀。

我看不到多個可寫映射存在的位置。我明明在這裏錯了嗎?

+0

想要顯示您的實體和代碼?異常中的字段是什麼,你如何映射它?你的表結構是什麼樣的?我的猜測是你有執行器 - > devicestate多次映射。 – Chris

回答

0

要解決這個問題,我想說,我使用一個連接表。我不確定導致原始錯誤的是什麼,但我認爲JPA假設我的兩個相同類型的實體實際上是同一個實體。

0

從它的聲音來看,Actuator的表格包含一個外鍵,但您已將其映射到Listener和DeviceState實體。由於Listener的pk已包含對DeviceState的引用,因此可以表示對象模型,以使Actuator引用引用DeviceState的Listener。 ActuatorPK不需要;執行器只能使用ListenerPK類作爲主鍵,因爲這兩個表只是使用DeviceStatePK和String作爲主鍵。

@Entity 
@IdClass(ListenerPK.class) 
public class Actuator { 
    @Id 
    @OneToOne 
    Listener listener; 
    .. 
} 
@Entity 
@IdClass(ListenerPK.class) 
public class Listener{ 
    @Id 
    @ManyToOne 
    DeviceState deviceState; 
    @Id 
    String stringId; 
    .. 
} 

您將通過其偵聽器參考獲得與Actuator關聯的DeviceState。另外,您可以將其映射爲只讀內執行機構:

@Entity 
@IdClass(ListenerPK.class) 
public class Actuator { 
    @Id 
    @OneToOne 
    Listener listener; 
    @ManyToOne 
    @JoinColumn(name="deviceState_id", insertable=false, updatable=false) 
    DeviceState deviceState; 
    .. 
} 

http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers

相關問題