我目前的结构如下(伪代码):
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)”作为订单实体的 ID,那么您选择的 ID 可能是不够的。
在 JPA 中,每个实体都应该有一个唯一的标识符。如果有两个订单(一个用于 X,一个用于 Y)使用相同的 ID,那么一切都会变得困惑。
我个人的建议是让 ID 在整个系统中保持唯一。如果您希望每个客户端都有某种序列号,请将其保留为另一个字段。
当然,还有另一种选择,将 Client ID 和 Order 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;
}
关于java - 控制延迟(或急切)加载的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22778913/