0

这是我在使用 jpa 时注意到的一件奇怪的事情。我正在使用 openjpa 1.0、RAD 8.0 和 WAS 6.1(不,我不能使用 jpa 2)。

我有一个 ProductArrangement 类,并且在该类中有一个帐户列表。在一个帐户中,我有一个报表列表。当我使用初始帐户和初始语句创建初始 productArrangement 时,持久性完美无缺。一切都正确存储在数据库中。

稍后我想在 productArrangement 中的帐户中添加一条语句,我可以通过查找访问该语句,但持久性在帐户或语句中没有结果。productArrangement 的更改是成功的。但是,当我在 getAccount().addStatement(statement) 之前执行 getAccount().getStatements() 时,它可以正常工作。这怎么可能?是因为我必须先获取它的惰性获取吗?

4

1 回答 1

0

> 是不是因为我必须先获取它的惰性获取?

呃……是的,不是的。
是的:似乎延迟加载没有发生,所以你有一个错误。
不:它可能不是提供程序代码中的错误,但可能是您的代码中的错误addAccount()and addStatement()

添加新帐户或报表应该意味着将关系导航到这些实体集合。它应该自动触发任何延迟加载,所以这不应该是你的错误的原因。

但是,您需要通过调用 getter 方法来导航关系,以从您的实体中自动触发延迟加载。直接访问实体中的实例字段永远不会触发延迟加载 - 这将是您的代码中的错误,而不是 JPA 提供程序。

> 但是,当我在 getAccount().addStatement(statement) 之前执行 getAccount().getStatements() 时,它可以正常工作。

也许您的方法如下所示:

 public class Account {

     // fields and methods ...

     public void addStatement(Statement s) {
          this.statementsCollection.add(s);
     }
 }          

如果是这样,那是延迟加载的错误。它应该如下所示:

 public class Account {

     // fields and methods ...

     public void addStatement(Statement s) {
          this.getStatements().add(s);
     }
 }          

也就是说,您的外部客户端/测试代码不需要人为地调用 getAccount().getStatements(),因为 addStatement 的内部代码会自动执行此操作。

:-D

于 2012-10-16T07:01:01.570 回答