2014-04-01 71 views
0

我現在有一個結構如下(僞代碼):控制什麼是懶惰(或渴望)加載

public class Order 
{ 
    @OneToMany(targetEntity = Orderline.class, fetch = FetchType.LAZY) 
    private List<Orderline> orderlines; 

    private Client client; 
} 

public class Orderline 
{ 
    @ManyToOne(mappedBy = 'orderlines') 
    private Order order; 

    private Client client; 
} 

public class Client 
{ 
    // your usual Client class, its contents aren't important for the question 
} 

說我可以與ID 123的順序,這屬於客戶機X.我還可以有一個ID 123的訂單屬於客戶端Y.當延遲加載(或急切加載,對於這個問題),我怎麼能知道當我從數據庫中獲取客戶端X的ID 123的訂單時,我不會得到客戶Y的訂單?如果JPA僅檢查訂單行上的外鍵,有沒有辦法在懶惰(或急切)加載時爲客戶添加支票?

我想解決這個問題,而不使用像Hibernate或Eclipselink這樣的特定實現,這樣我就可以根據需要在實現之間輕鬆切換。

+0

選中要做出什麼..? – Dileep

+0

我想檢查客戶屬性,所以我可以獲取訂單123屬於什麼和客戶X. – Stefan

+0

你說你需要根據訂單ID和客戶ID來獲取值。我對麼 ?? – Dileep

回答

2

如果您僅使用「ID(123)」作爲訂單實體的ID,則您選擇的ID可能不足。

在JPA中,每個實體都應該有一個唯一的標識符。如果有兩個訂單(一個用於X,一個用於Y)使用相同的ID,那麼一切都會搞砸。

我個人的建議是讓ID在整個系統中唯一。如果你想爲每個客戶端提供某種類型的序列號,請將它保留爲另一個字段。

當然,還有另一種選擇是將客戶端ID和訂單ID作爲組合鍵。

總之,確保您選擇的ID可以唯一標識一個實體(通常是指數據庫中的一行)。

一個例子(第一種方法,唯一ID)

public class Order 
{ 
    @Id 
    private Long id; 

    @OneToMany(targetEntity = Orderline.class, fetch = FetchType.LAZY) 
    private List<Orderline> orderlines; 

    private Client client; 

    private Long orderSequence; // unique within a client 
} 

public class Orderline 
{ 
    @Id 
    private Long id; // unique ID of order line 

    @ManyToOne(mappedBy = 'orderlines') 
    private Order order; 

    // not necessary, as you can access through orderLine.order.client 
    // private Client client; 
} 

第二條本辦法(複合鍵):

public class Order 
{ 
    @EmbeddedId 
    private OrderId id; 

    @ManyToOne 
    @JoinColumn(insertable=false, updatable=false) 
    private Client client; 

    @Column(insertable=false, updatable=false) 
    private Long orderSequence; // unique within a client 

    @OneToMany(targetEntity = Orderline.class, fetch = FetchType.LAZY) 
    private List<Orderline> orderlines; 
} 

@Embeddable 
public class OrderId { 
    Long clientId; 
    Long orderSequence; 
} 
+0

我還沒有考慮過某種類型的序列,這聽起來像是一個可行的解決方案。謝謝! – Stefan