2014-04-01 53 views
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这样的特定实现,这样我就可以根据需要在实现之间轻松切换。

+0

选中要做出什么..? – Dileep

+0

我想检查客户属性,所以我可以获取订单123属于什么和客户X. – Stefan

+0

你说你需要根据订单ID和客户ID来获取值。我对么 ?? – Dileep

回答

2

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

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

我个人的建议是让ID在整个系统中唯一。如果你想为每个客户端提供某种类型的序列号,请将它保留为另一个字段。

当然,还有另一种选择是将客户端ID和订单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; 
} 
+0

我还没有考虑过某种类型的序列,这听起来像是一个可行的解决方案。谢谢! – Stefan