2014-02-20 58 views
0

我需要使用JPA與現有數據庫表一起工作。這些表使用複合主鍵。外鍵屬性與表的主鍵重疊。JPA @OneToMany與複合PK - PK/FK重疊

簡單的例子,每一個 '秩序' 有很多 '的OrderItems'

Table Order     Table OrderItem 
-------------------   ---------------------- 
businessDomain (PK)   businessDomain (PK/FK) 
orderId  (PK)   oItemId  (PK) 
field1      orderId  (FK) 
field2 ...     description ... 

我創建下列實體和ID類:

// ============== Order Entity ====================== 
@Entity 
@IdClass(OrderId.class) 
public class Order implements Serializable { 

    @Id 
    private long busindessDomain; 

    @Id 
    private long orderId; 

    private String field1; 
    private String field2; 

    //Getters/Setters 
} 

// ============== OrderItem Entity ================== 
@Entity 
@IdClass(OrderItemId.class) 
public class OrderItem implements Serializable { 

    @Id 
    private long busindessDomain; 

    @Id 
    private long oItemId; 

    private String description; 

    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="orderId", referencedColumnName="orderId", insertable=false, updatable=false) 
    private Order order; 
    //Getters/Setters 
} 

// ============== OrderId class ===================== 
public class OrderId implements Serializable { 

    private long busindessDomain; 
    private long orderId; 

    //Getters/Setters 
} 

// ============== OrderItemId class ================= 
public class OrderId implements Serializable { 

    private long busindessDomain; 
    private long oItemId; 

    //Getters/Setters 
} 

但是那並不是工作。 那麼我需要做什麼才能從orderItem獲得正確的映射,以便對重疊鍵和複合鍵進行排序?

謝謝你的幫助。 丹尼爾


編輯:

好吧,這裏是另一個嘗試,似乎工作。 需要進一步測試。

// ============== Order Entity ====================== 
@Entity 
@IdClass(OrderId.class) 
public class Order implements Serializable { 

    @Id 
    private long busindessDomain; 

    @Id 
    private long orderId; 

    private String field1; 
    private String field2; 

    @OneToMany(targetEntity=OrderItem.class, mappedBy="order") 
    private List<OrderItem> orderItems; 

    //Getters/Setters 
} 

// ============== OrderItem Entity ================== 
@Entity 
@IdClass(OrderItemId.class) 
public class OrderItem implements Serializable { 

    @Id 
    private long busindessDomain; 

    @Id 
    private long oItemId; 

    private String description; 

    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumns({ 
     @JoinColumn(name="businessDomain", referencedColumnName="businessDomain"), 
     @JoinColumn(name="orderId", referencedColumnName="orderId") 
    }) 
    private Order order; 

    //Getters/Setters 
} 

回答

0

你foiegn關鍵就是busindessDomain,而不是OrderId。你可以試試這個嗎?

@Entity  
    public class Order { 



    @EmbeddedId 
    private OrderPk orderId; 

    //getter/setter... 

    @Embeddable 
    private static class OrderPk { 
     private long busindessDomain; 
     private long oItemId; 
    }  
    } 

OrderItem的:

@Entity  
    public class OrderItem{ 



    @EmbeddedId 
    private OrderItemPk orderTemId; 

    @ManyToOne 
    @JoinColumns(value = { @JoinColumn(referencedColumnName = "businessDomain", name="businessDomain")}) 
    private Order order; 


    getter/setter... 

    @Embeddable 
    private static class OrderItemPk{ 
     private long busindessDomain; 
     private long oItemId; 
    }  
    } 
+0

我想我需要兩個,businessDomain和訂單ID引用到訂單。只有businessDomain,我會爲每個orderItem獲得數百萬的訂單。 – reindan

+0

對不起。 orderId也是我需要誤解的關係。只需將orderId作爲參考列添加即可。 – Rohit