java - 控制延迟(或急切)加载的内容

标签 java jpa-2.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 等特定实现的情况下解决这个问题,这样我就可以在必要时轻松地在实现之间切换。

最佳答案

如果您仅使用“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/

相关文章:

java - 如何避免在函数(JAVA)中返回 NULL 值?

java - OneToMany、ManyToOne 为什么子级中的父级值为空?

java - 由于 "cannot find annotation method name() in type javax.persistence.Table"编译错误

java - 无法实例化 TrueZip 类

java - 在 runInUiThread 中使用 setText 时出错

java - JPA2 Lazy Child Collection with orphanRemoval=true 删除 'not-fetched' child

java - 如何获取选择不同的结果作为实体列表而不是元组

java - 将类传递给另一个方法

java - BufferedReader 似乎无限读取第一行

java - glassfish应用程序服务器中的Web服务器是什么?