这是我在使用jpa时注意到的奇怪事情。我使用的是openjpa 1.0,RAD 8.0和WAS 6.1(不,我不能使用jpa 2)。
我有一个ProductArrangement类,在该类中有一个Accounts列表。在帐户中,我有一份陈述清单。当我使用初始帐户和初始语句创建初始productArrangement时,persist可以完美地工作。一切都妥善存储在数据库中。
稍后我想在productArrangement中为帐户添加一个语句,即我获得了查找权限,但是持久者在帐户或语句中没有结果。 productArrangement的变化是成功的。但是,当我在getAccount()。addStatement(statement)之前执行getAccount()。getStatements()时,它工作正常。这怎么可能?是因为我之前需要做的懒惰抓取吗?
答案 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