【问题标题】:JPA cascade options at runtime运行时的 JPA 级联选项
【发布时间】:2010-09-28 03:24:18
【问题描述】:

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

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

但是,可以更改需要持久性的父对象中的字段,并且我可以确定没有任何子对象受到影响。所以我想持久化父级,而不用所有级联子级持久化访问数据库。

例如

@Entity
public class Parent {

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

}

当我持久化父对象时,如何覆盖级联选项?还是应该将其设置为 REFRESH 并确保我永远不需要级联持久化?

【问题讨论】:

    标签: java database jpa persistence cascade


    【解决方案1】:

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

    当您加载一个对象时,它还将获得任何急切 (FetchType.EAGER) 关系的另一端,由关系上的 fetch 属性定义。

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

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

    所以,丢掉级联,保持获取和问题解决。

    我个人认为 cascade 都是自找麻烦,但意见会有所不同。

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

    这仅仅是为了性能而异步更新的问题吗?还是另有原因?

    【讨论】:

    • 这是一个独立的应用程序,数据库在同一台机器或附近的服务器上。整个模型需要在内存中,以便用户可以使用它。我试图让所有用户操作的结果保持不变,这样他们就不必点击“保存”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多