当前位置: 首页 > 知识库问答 >
问题:

用于单向关系的JPA级联而无需加载所有内容

养鸿运
2023-03-14

因此,我有一些实体被用作坐标系的基础,在本文中,我们将它们称为aBCD。这些实体中的每一个都有多个@OneTomany关系,我希望级联删除。即,当某些A被删除时,每个@OneTomany关系中的所有实体也被删除。相当标准的东西。

然而,当我想做的只是级联删除时,我不认为让这些实体显式跟踪这些关系有什么意义。我看不出加载所有这些实体有什么意义(可能是数百万!)每次将新实体添加到@OneTomany关系(即使用惰性加载仅在访问时加载,但当然在添加关系中的新实体时访问)时才加载到内存中。

我们再加一个小例子:

@Entity
public class A {
    @Id
    private long id;

    // ... other fields ...

    @OneToMany
    private Collection<SomeClass> collection;
}

@Entity
public class SomeClass {
    @Id
    private long id;

    // ... other fields ...

    @ManyToOne
    A a;

    @ManyToOne
    B b;

    // ... likewise for C, D ...
}

可以有多个类似于someClass的类,因此在A(以及B、C、D)中有多个@OneTomany关系,需要进行跟踪。这很快就会变得乏味。而且,每次添加someClass的新实例时,我都需要加载整个集合,这似乎非常低效(我几乎最终将整个数据库加载到内存中,只是为了级联删除!!!)。

在不修改底层数据库(例如在定义中指定DELETE CASCADE)的情况下,我如何实现我想要的,想必JPA的设计者已经考虑过这样的用例了吧?在向关系中添加实体时需要加载整个集合(如果是这样,请解释原因:)),这可能是错误的。

共有1个答案

羊舌勇
2023-03-14

要在不初始化所有实体的情况下实现多级级联,您只能使用DB级联。

别无他法!这就是为什么你找不到满意的解决办法。

至于:

@OrderColumn(name="orders_index")
public List<Order> getOrders() { return orders; }

索引列表将使用索引键进行添加/删除/更新操作。与只删除所有元素并用剩余元素重新创建集合的Bag相反,index List将使用index键仅删除不再属于List的元素。

 类似资料:
  • 环境:Spring 4.0.3,spring-data-jpa 1.2.0,Hibernate 4.2.10,jackson 2.3.3,lombok 1.12.6, 科目实体(已编辑) 用户实体(已编辑) 事务管理器(编辑)

  • 我的实体之间有一个复杂的层次结构。由于一个错误(见下文),我在许多地方放入了cascade.all或cascade.persisted。从上到下,注释都可以。但自下而上,不是我想要的。 它会导致对象被重复保存。 我如何解决这个问题?? 无级联错误: InvalidStateException:在刷新期间通过字段“com.xxx.yyy.data.entity.f.e”级联持久性时,遇到了处于生命周

  • 我在将带有@ManyToOne关系的实体(雇员)映射到带有@OneToMany关系的实体(社区)时遇到了问题。 当我将一个实体(社区)分配给一个实体(员工),其中社区的值为空时,它工作正常。 问题出现了,如果雇员已经为社区分配了价值。当我更改该值并保存更改时,该员工为社区获得了新的值,并且这个新社区在集合中获得了该员工。唯一的问题是,老社区仍然有这个员工在收集,但它应该被删除。这只有在数据库重新启

  • 问题内容: 我有一个设置,其中猫可以由许多所有者拥有,每个所有者可以拥有几只猫。鉴于此,我想写一个说明来帮助我找到具有给定主人姓名的所有猫。 这是一个简单的类设置。 *为简洁起见,没有getters / setter。id字段在超类中。 *为简洁起见,没有getters / setter。id字段在超类中。 这是一个存储库,其中包含有效的查询和无效的规范。 请帮我写规范。 我遇到的麻烦是,这种关系

  • 假设我们有两个实体,Entity和Entity。有多个s。节点可以属于多个集群。因此,在

  • 这就是我在教师实体中所拥有的: 现在我喜欢使用数据库的功能。重复一遍:数据库的删除级联功能只针对Student_Teacher-table! 问题是: 问题是:这很好,但是要触发删除中的条目,我必须在两边指定。Hibernate不解析,只看到,并将目标实体(和引用的学生)从缓存中删除,但它们仍然在数据库中!!!因此,我不得不在空降后彻底清除Hibernate期,重新阅读教师、傅太太、巴尔先生和学生