1

我对 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-Query 它会按预期工作,这意味着每个属性都已填充:

select object(o) from B o  

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

select object(o) from A o  

我尝试通过 aReceivedAObject.getBEntities(); 它返回空值。

如果我更改或扩展 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
但这没有t似乎有什么不同:(

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

//编辑:更正错字:将“public List getBEntities()”更改为“public List getBEntities()”

4

2 回答 2

0

在另一个类中,我调用了 ADAL 的 findAll 方法。

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

虽然在所有地方都有持久性上下文可能会变得混乱,因为您可能被迫手动合并它们之间的实体。另一种方法是将该getBEntities()方法包装在数据访问层 (ADAL) 中。

于 2011-07-05T22:58:19.997 回答
0

如果您在惰性模式下使用 OneToMany,并且您想在事务之外使用它,它将为 null 或空列表,这取决于初始化的归档值是什么(在事务内部,JPA 将进行另一个查询以选择,所以这将是一个填充列表)。使用select o from A o join fetch o.as a(如果在 B 类中,List as 字段称为 as)。或者使用left join fetch,取决于你的需要。

于 2018-09-07T08:49:59.813 回答