簡體   English   中英

JPA-嘗試使用IdClass而不是EmbeddedId映射共享復合鍵時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM