Java 控制懒惰(或渴望)加载的内容

Java 控制懒惰(或渴望)加载的内容,java,jpa-2.0,Java,Jpa 2.0,我目前的结构如下(伪代码): 公共类秩序 { @OneToMany(targetEntity=Orderline.class,fetch=FetchType.LAZY) 私有列表命令行; 私人客户; } 公共类命令行 { @manytone(mappedBy='orderlines') 私人秩序; 私人客户; } 公共类客户端 { //您通常使用的客户机类,其内容对于问题并不重要 } 假设我可以有一个ID为123的订单,它属于客户机X。我也可以有一个ID为123的订单,它属于客户机Y。当延迟加

我目前的结构如下(伪代码):

公共类秩序
{
@OneToMany(targetEntity=Orderline.class,fetch=FetchType.LAZY)
私有列表命令行;
私人客户;
}
公共类命令行
{
@manytone(mappedBy='orderlines')
私人秩序;
私人客户;
}
公共类客户端
{
//您通常使用的客户机类,其内容对于问题并不重要
}
假设我可以有一个ID为123的订单,它属于客户机X。我也可以有一个ID为123的订单,它属于客户机Y。当延迟加载(或急加载)时,我怎么知道当我从数据库中获取客户机X的ID为123的订单时,我不会从客户机Y获取订单行?如果JPA只在订单行端检查外键,那么在延迟(或急切)加载时是否有方法为客户端添加检查


我希望在不使用Hibernate或Eclipselink等特定实现的情况下解决此问题,以便在必要时可以轻松地在实现之间切换。

如果您仅使用“ID(123)”作为订单实体的ID,您选择的ID可能不够

在JPA中,每个实体都应该有一个唯一的标识符。如果将有两个订单(一个用于X,一个用于Y)使用相同的ID,那么一切都会一团糟

我个人的建议是使ID在整个系统中是唯一的。如果您希望每个客户端都有某种序列号,请将其保留为另一个字段

当然,还有另一种选择,将客户机ID和订单ID作为复合键

简言之,确保您选择的ID能够唯一地标识一个实体(通常指DB中的一行)

示例(第一种方法,唯一ID)

公共类秩序
{
@身份证
私人长id;
@OneToMany(targetEntity=Orderline.class,fetch=FetchType.LAZY)
私有列表命令行;
私人客户;
private Long orderSequence;//在客户端中是唯一的
}
公共类命令行
{
@身份证
private Long id;//订单行的唯一id
@manytone(mappedBy='orderlines')
私人秩序;
//不需要,因为您可以通过orderLine.order.client进行访问
//私人客户;
}

第二种方法(组合键):

公共类秩序
{
@嵌入ID
私有医嘱id;
@许多酮
@JoinColumn(可插入=false,可更新=false)
私人客户;
@列(可插入=false,可更新=false)
private Long orderSequence;//在客户端中是唯一的
@OneToMany(targetEntity=Orderline.class,fetch=FetchType.LAZY)
私有列表命令行;
}
@可嵌入
公共类OrderId{
长阴蒂;
长序列;
}

您想做什么检查..?我想检查客户属性,这样我就可以获取属于订单123和客户X的订单行。您是说您需要基于订单id和客户id获取值。。!!我说的对吗?理想情况下你不在乎。当您访问订单行列表时,JPA将获取它,如果它还没有。请参阅我的类似问题,它包含一些代码:我还没有考虑某种序列,这听起来像是一个可行的解决方案。谢谢
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
}
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;
}