簡體   English   中英

控制什么是懶惰(或急切)加載

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

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