运行时的JPA级联选项

时间:2008-12-23 04:56:03

标签: java database jpa persistence cascade

我正在尝试创建一个应用程序,通过观察所有更改,然后立即将对象保存在问题中,使对象模型与数据库保持同步。模型中的许多对象都有大型列表或树中的子项。

当我从数据库加载一个对象时,我依靠一个单向级联关系来检索它的所有子对象并将它们包含在应用程序中。

但是,可以更改父对象中需要持久性的字段,我可以确定没有子节点受到影响。所以我想坚持父母,而不是在所有级联的孩子坚持下去的数据库。

例如

@Entity
public class Parent {

    @OneToMany(cascade=CascadeType.ALL)
    public List children;

}

当我持久保存Parent对象时,如何覆盖级联选项?或者我应该将它设置为REFRESH并确保我从不需要级联持续存在?

1 个答案:

答案 0 :(得分:4)

从数据库中读取对象并持久化它们依赖于两个不同的注释。

当你加载一个对象时,它也会得到任何渴望(FetchType.EAGER)关系的另一端,这是由关系中的fetch属性定义的。

根据您的JPA提供程序,您可以选择覆盖此行为。 EclipseLink,通过非常有用的QueryHint.BATCH,当然可以。

当您持久,删除或刷新时,级联类型是相关的。

所以,失去级联,保持获取和解决问题。

就我个人而言,我认为级联都是在寻求麻烦,但意见会有所不同。

一个体面的JPA提供商已经拥有一个非常复杂(可配置)的缓存方案。也许你应该问为什么要重新发明那个特定的轮子?

纯粹是出于性能而异步更新的问题吗?或者是其他原因?