[英]Controlling what is lazy (or eager) loaded
我目前有一個如下結構(偽代碼):
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等特定實現的情況下解決這個問題,這樣我就可以在必要時輕松切換實現。
如果您只是使用“ID(123)”作為Order實體的ID,則您對ID的選擇可能不夠。
在JPA中,每個實體都應具有唯一標識符。 如果有兩個訂單(一個用於X,一個用於Y)使用相同的ID,那么一切都搞砸了。
我個人的建議是在整個系統中使ID唯一。 如果您希望每個客戶端使用某種序列號,請將其保留為另一個字段。
當然,還有另一種選擇,即將客戶ID和訂單ID作為復合密鑰。
簡而言之,確保您選擇的ID可以唯一地標識實體(通常表示DB中的行)。
一個例子(第一種方法,唯一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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.