JPA在延迟获取字段上持续级联失败

时间:2012-10-15 20:09:48

标签: jpa lazy-evaluation cascade openjpa

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

我有一个ProductArrangement类,在该类中有一个Accounts列表。在帐户中,我有一份陈述清单。当我使用初始帐户和初始语句创建初始productArrangement时,persist可以完美地工作。一切都妥善存储在数据库中。

稍后我想在productArrangement中为帐户添加一个语句,即我获得了查找权限,但是持久者在帐户或语句中没有结果。 productArrangement的变化是成功的。但是,当我在getAccount()。addStatement(statement)之前执行getAccount()。getStatements()时,它工作正常。这怎么可能?是因为我之前需要做的懒惰抓取吗?

1 个答案:

答案 0 :(得分:0)

>是因为我之前需要做的懒惰提取吗?

错误......是和否。
是的:似乎没有发生延迟加载,所以你有一个错误 否:它可能不是提供商代码中的错误,但可能是您的addAccount()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