2012-03-14 44 views
3

我在通过OpenJPA实现利用JPA 1.0时遇到了问题。我的数据模型包含一个与Leg有OneToMany关系和与Passenger有OneToMany关系的Trip。 Leg和Passenger在PassengerLeg中有关联。这被映射为双向OneToMany/ManyToOne。所以基本上我的数据模型中有一颗钻石。如果一次旅行有2条腿和3名乘客,则会有6条乘客腿。对于各种用例,我需要从每个实体的每个方向。现在,当我试图加载所有内容时,PassengerLeg中的腿部字段将为空,我无法弄清楚原因。这里是我的类的轻薄表示:JPA不急于加载所有内容

@Entity 
public class Trip { 

    @OneToMany(mappedBy = "trip", fetch = FetchType.EAGER) 
    private List<Leg> legs; 

    @OneToMany(mappedBy = "trip", fetch = FetchType.EAGER) 
    private List<Passenger> passengers; 

} 

@Entity 
public class Leg { 

    @ManyToOne 
    @JoinColumn(name = "TRIP_ID") 
    private Trip trip; 

    @OneToMany(mappedBy = "leg", fetch = FetchType.EAGER) 
    private List<PassengerLeg> passengers; 

} 

@Entity 
public class Passenger { 

    @ManyToOne 
    @JoinColumn(name = "TRIP_ID") 
    private Trip trip; 

    @OneToMany(mappedBy = "passenger", fetch = FetchType.EAGER) 
    private List<PassengerLeg> legs; 

} 

@Entity 
public class PassengerLeg { 

    @ManyToOne 
    @JoinColumn(name = "LEG_ID") 
    private Leg leg; //this will be null 

    @ManyToOne 
    @JoinColumn(name = "PASSENGER_ID") 
    private Passenger passenger; 

} 

我花了无数小时来阅读文档和任何我可以找到关于谷歌要弄清楚什么可能导致这一点,但我没有任何运气。任何人有任何想法会导致这种情况?让我知道你是否需要关于类/注释的更多信息。

+1

是不是你在那些一对多注释丢失'mappedBy'? – madth3 2012-03-14 23:00:00

+0

谢谢。我在这个例子中忘记了mappedBy属性中添加了,但是在我的应用程序中。 OneToMany注释中也有一个丢失的提取属性。 – Marshmellow1328 2012-03-15 14:20:46

回答

6

JPA永远不会加载许多方面,因为它可能是耗时的操作。默认的JPA规格抓取提到

  1. 一对一--->获取渴望
  2. 一对多--->获取懒
  3. 多对一--->取渴望
  4. 许多许多--->获取懒

我也不会建议你去预先抓取,因为它是沉重的操作

+0

所以当我遇到这样一种需要遍历多对多的情况时,你有如何处理它的建议吗?我无法想象一个渴望获取比获取我的基础对象慢并且手动遍历它来检索所有对象,因为我需要它们。更不用说,即使我明确地将其设置为渴望获取,它仍然不会热切地获取数据。 – Marshmellow1328 2012-03-25 21:25:38

+0

在EBJ QL查询中明确使用连接,以便可以获取所需的数据。[JPQL](http://en.wikibooks.org/wiki/Java_Persistence/Querying) – 2012-03-27 09:38:51

+0

由于您链接的站点对JPA 1.0所说的任何其他想法都不能做这种情况下需要嵌套的提取? – Marshmellow1328 2012-04-03 19:26:36