【问题标题】:JPA persist cascade failing on lazy fetch fieldJPA在延迟提取字段上坚持级联失败
【发布时间】:2012-10-05 21:00:09
【问题描述】:

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

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

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

【问题讨论】:

  • 延迟提取不应该是问题,因为当您调用 addStatement 时,应该填充延迟集合。请发布您的 ProductArrangement、Account 和 Statement 类的代码。

标签: jpa lazy-evaluation cascade openjpa


【解决方案1】:

> 是不是因为它的惰性获取,我必须先做一个 get 操作?

呃……是的,不是的。
是的:似乎没有发生延迟加载,所以你有一个错误。
不:它可能不是提供程序代码中的错误,但可能是您的代码中的错误 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多