2014-07-24 39 views
0

所以我有一些实体被用作坐标系的基础,为了本文的目的,我们将其称为AB,CD。每个实体都有多个@OneToMany关系,我想级联删除。即,当某个A被删除时,@OneToMany关系中的每一个中的所有实体也被删除。相当标准的东西。JPA级联单向关系,不加载所有内容

但是,我没有看到让这些实体明确跟踪这些关系的时候,我想要做的就是级联删除。每次将一个新实体添加到@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等多个@OneToMany关系,需要黏合A(和B,C,D)。这会让FAST变得单调乏味。此外,每次添加SomeClass的新实例时,我都需要加载整个集合,这看起来非常低效(我最终将整个数据库加载到内存中,以便级联删除!!!) 。

如何在不修改底层数据库的情况下实现我想要的功能(例如在定义中指定ON DELETE CASCADE),JPA的设计人员是否考虑过这种用例?也许我错了,我需要加载整个集合时添加一个实体的关系(如果是这样,请解释为什么:))。

在这里提出了一个类似的问题:JPA: unidirectional many-to-one and cascading delete但它没有一个令人满意的解决方案,它不讨论是否将整个关系加载到内存中。

+0

你有很多解释发布,但是,我没有得到明确的观点。 – CycDemo

回答

0

要实现多级级联而不初始化所有实体,只能使用数据库级联。

没有其他办法了!这就是为什么你找不到满意的解决方案。

至于:

而且,每次添加SomeClass的一个新的实例时,我需要 负载整个集合,这似乎非常低效的(我 几乎结束与我的整个数据库加载到内存只是为了 级联删除!!!)。

您需要的unidirectional Collections taxonomy理解:

  1. 添加一个元素的集合,需要全收集是初始化强制执行唯一集合同。

  2. java.util.Collection或unindexed List意味着你有一个Bag,它在单向用例中非常低效。对于逆向收集,它们很好,但是超出了当前的上下文。

  3. 索引列表(如该命令是在数据库化)是什么,你可能会寻找:

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

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