我对JPA 1.0(OpenJPA)有问题

跟随情况

@Entity
public class A{
    private Long aId;
    private List<B> bEntities;
    //myId getter and setter
    @OneToMany(mappedBy="referencedA")
    public List<B> getBEntities(){
        return bEntities;
    }
    public void setBEntities(List<B> bEntities){
        this.bEntities = bEntities;
    }
}




@Entitiy
public class B{
    private Long bId;
    private Long aId;
    private A referencedA;
    //aId/bId getter and setter
    @ManyToOne
    @JoinColumn(name="A_ID", referencedColumnName="A_ID")
    public A getReferencedA(){
        return referencedA;
    }
    public void setReferencedA(A referencedA){
        this.referencedA = referencedA;
    }
}


如果我执行以下JPQL查询,它将按预期工作,这意味着每个属性都已填充:

select object(o) from B o


但是,如果我想获得全部作为:

select object(o) from A o


我尝试通过aReceivedAObject.getBEntities();获得B列表。它返回null。

如果我如下更改或扩展OneToMany批注:

@OneToMany(mappedBy="referencedA", fetch=FetchType.EAGER)


一切都按预期进行。

但是我需要延迟获取,因为其他所有东西都太慢了。

我真的希望有人可以帮助我解决问题,因为我已经坚持了三天了:(

注意,如果它很重要:
我(必须)使用Websphere 6.1(带有EJB 3.0的Feature-Pack),后者使用OpenJPA 1.0。这是一个JavaEE项目。
据我了解我需要启用增强功能的OpenJPA-Doc所描述的,我已经完成了此处的操作http://www.ibm.com/developerworks/websphere/techjournal/0612_barcia/0612_barcia.html#sec4f
但这似乎没有什么区别:(

提前致谢!!!
亲切的问候,
asotbb

// edit:更正的错字:将“ public list getBEntities()”更改为“ public List getBEntities()”

最佳答案

从另一堂课我称之为ADAL的
  findAll方法。


是的,这是您的问题,如果它不是持久性感知的,那么如果您希望ReceivedAObject.getBEntities()与延迟加载一起使用,则需要使该类了解持久性上下文。

持久性扩展到处都是,但会变得混乱,因为您可能被迫手动在它们之间合并实体。您可以执行的另一种方法是将getBEntities()方法包装在数据访问层(ADAL)中。

07-24 13:45