2014-06-16 25 views
0

我有一个JPA实体是这样的:删除级联JPA时挂起大量对象

@Entity 
class MyEntity{ 
    @JsonIgnore 
@OneToMany(mappedBy = "application", cascade = ALL, fetch = LAZY) 
private List<MyChildEnity> myChildEntities; 
} 
... 
@Entity 
class MyChildEnity { 
    @ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = { REFRESH, 
     DETACH }) 
@JoinColumn(name = "APPLICATION_ID") 
private MyEntity application; 
} 

我从一个REST调用访问该实体。当元素数量非常大时,我尝试删除MyEntity Object,REST调用会挂起然后超时。对于MyChildEnity表中的少量元素,它工作正常。当我调试时,我看到JPA一次获取一条记录并删除它。这太慢了,工作太多了。

这是预期的行为?不应该JPA智能地将其转换为MyChildEnity表上的单个DELETE调用。

我使用OpenJPA和Derby和DB2数据库。

+0

建议您发布所调用的SQL,并计算出每个SQL的用途。例如1个SQL撤回列表中的元素,然后1个SQL撤回子项的其他字段?如果是的话哪个字段? –

+0

是的...首先有一个SELECT获取所有元素,然后一个DELETE调用该列表中的每个条目 –

回答

0

你为每个元素得到一个删除语句的原因可能与JPA让你在删除之前和之后做一些事情有关。如果您使用delete语句编写JPQL,则可以绕过回调机制并删除单个请求中的所有内容。

Documentation for entity listeners and callbacks.(这是JPA功能)。

+0

谢谢..这有助于 –