2013-10-29 60 views
0

一旦你看到此組合鍵,並使用它們,我在代碼塊後下來的實體,請參考下pseudotable,我需要IdClass共享複合鍵在數據庫的地址實體:JPA - 錯誤試圖映射使用,而不是一個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枚舉

那麼,我試圖讓地址實體的映射,但它不起作用,我不知道爲什麼。它一直說(EclipseLink),我有名稱和類型不匹配的問題。我不明白爲什麼如果IdClass沒有別名屬性(當然也沒有實體),那麼它就像一個魅力,以及與完整的AddressId IdClass(與別名屬性),但使用EmbeddedId。我需要的是像我發佈的地址實體。

映射錯誤在哪裏?

預先感謝您!

回答

0

我認爲你必須添加@Enumerated(EnumType.STRING)enum

像這樣:

@Id 
@Enumerated(EnumType.STRING) 
private DocumentType documentType; 
+0

感謝您的迴應,但這不是因爲枚舉類型隱式地繼承ORDINAL賦值。 –

0

我不能直接回答你的問題。但是,這裏有一個觀察,可以幫助:

我覺得你的數據庫架構的工作需要你把它映射到Java前。下面是一些建議:

1:每一個數據庫表中應該有一個且只有一個主鍵(通常是長型)和主鍵不應該有商業意義。任何地方都沒有複合鍵由於沒有組合鍵,您的原始問題不再是問題。

2:主密鑰與ID表名後通常命名爲後(從不使用只是「ID」作爲名稱)。

例子: 地址 addressID長的PrimaryKey

3:你叫主鍵也許應該是外鍵的其他字段(後他們ID long類型)引用了其他表的主鍵。

4:您需要正確地規範化您的數據庫表。例如:'fullAddress'列可能應該分成streetAddress,city,stateID,countryID,zipcode。另一個例子:ADDRESS表應該只包含地址信息。爲什麼它有DOCUMENTTYPE?這與地址有什麼關係?

5:應清楚地理解數據庫表和列的名稱。 「DOCUMENTNR」這一欄對我來說沒有任何意義。

6:您的數據庫表和列應該是nowns,並且它們通常應該映射到具有相同名稱的java類。相反,你有一個名爲AddressId的類,它顯然映射到Address數據庫表。將該類重命名爲Address。

7:您需要決定哪些列是唯一的,而不是可以爲空的。

您可以聯繫您的友好社區數據庫管理員以獲取幫助創建數據庫模式的幫助。

+0

謝謝你的迴應,但這不是我要找的。那些你推薦的東西我很感激,但它並沒有回答我的問題(正如你在開頭所說的那樣)。這個問題我發佈它只是JPA的映射問題,對於已經存在且我無法更改的數據庫,該數據庫已正常化並且這些組合ID是唯一的,並且需要如此,模式是好的,我只需要將它映射到JPA。再次感謝你! –