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;
}