[英]JPA - Error trying to map a shared composite key using IdClass instead of an EmbeddedId
在看到我在代碼塊中張貼的組合鍵和使用它們的實體后,請參考地址實體中數據庫中需要具有的下一個偽表:
地址表:
ADDRESS
-------------------------------
DOCUMENTTYPE INT2 PK
DOCUMENTNR VARCHAR(10) PK
ALIAS VARCHAR(20) PK
FULLADDRESS VARCHAR(100)
...
實體和組合鍵:
@Embeddable
public class Document implements Serializable {
private DocumentType documentType;
private String documentNr;
...
@Entity
@IdClass(Document.class)
public class Person {
@Id
private DocumentType documentType;
@Id
private String documentNr;
private String fullName;
...
@Embeddable
public class AddressId implements Serializable {
private DocumentType documentType;
private String documentNr;
private String alias;
...
@Entity
@IdClass(AddressId.class)
public class Address {
@Id
@ManyToOne
private Person person;
@Id
private String alias;
private String fullAddress;
...
注意: DocumentType是一個枚舉 。
好吧,我正在嘗試為Address實體建立該映射,但是它不起作用,我不知道為什么。 它一直說(EclipseLink)我的名字和類型不匹配。 我不明白為什么如果AddressId IdClass沒有別名屬性(當然也沒有Address實體),那么它就像一個符咒一樣起作用,並且與完整的AddressId IdClass(具有alias屬性)一起使用,但是使用EmbeddedId 。 我需要的是像我發布的一樣具有Address實體。
映射錯誤在哪里?
先感謝您!
我認為您必須將@Enumerated(EnumType.STRING)
添加到您的enum
字段
像這樣:
@Id
@Enumerated(EnumType.STRING)
private DocumentType documentType;
我不能直接回答你的問題。 但是,以下觀察可能會有所幫助:
我認為您的數據庫架構需要工作,然后才能將其映射到Java。 這里有一些建議:
1:每個數據庫表應該只有一個主鍵(通常為long類型),並且主鍵應該沒有業務含義。 任何地方都沒有復合鍵。 由於沒有復合鍵,因此原來的問題不再是問題。
2:主鍵通常以表名命名,后跟ID(切勿僅使用“ ID”作為名稱)。
示例:地址addressID長primaryKey
3:您稱為主鍵的其他字段可能應該是引用其他表的主鍵的外鍵(在其后鍵入long並帶有ID)。
4:您需要正確規范化數據庫表。 示例:“ fullAddress”列可能應細分為streetAddress,城市,州ID,國家ID,郵政編碼。 另一個示例:ADDRESS表應僅包含地址信息。 為什么有DOCUMENTTYPE? 與地址有什么關系?
5:應該清楚地了解數據庫表和列的名稱。 “ DOCUMENTNR”列對我沒有任何意義。
6:您的數據庫表和列應為nowns,並且通常應將它們映射到具有相同名稱的Java類。 相反,您有一個名為AddressId的類,該類顯然映射到Address數據庫表。 將類重命名為Address。
7:您需要確定哪些列是唯一的並且不能為空。
您可以聯系您附近的鄰居數據庫管理員,以獲取有關創建數據庫架構的幫助。
派生的地址ID必須包含來自人的ID,這不是文檔的組成部分。 http://wiki.eclipse.org/EclipseLink/Development/JPA_2.0/mappedbyid顯示了一些示例,但更多地針對可嵌入對象,但是對於idclasss,概念是相同的。 嘗試
public class AddressId implements Serializable {
private Document person;
private String alias;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.