2011-02-10 55 views
2

我使用JPA中的以下内容:删除相关@OneToOne自动JPA

@Entity 
class ParentClass { 
    @Id 
    @GeneratedValue 
    private long id; 
    ... 
    @OneToOne(cascade = { cascade = { CascadeType.ALL }, 
         mappedBy = "parentClass") 
    ChildClass child; 
    .. 
} 

@Entity 
class ChildClass { 

    @OneToOne 
    ParentClass parentClass; 

} 

如果我做一个查询类似的createQuery(“DELETE FROM父类PC”),我的子类不会自动删除。

这可以用JPA-2.0来完成吗? (我的工作与@OneToMany关系)。

回答

4

批量DML查询(如DELETE FROM ParentClass pc忽略级联选项和orphanRemoval),因此如果实际需要在批量查询中执行此操作,则无法将JPA配置为自动删除ChildClass es。

但是,您可以通过在数据库模式中将REFERENCES ... ON DELETE CASCADE约束添加到ChildClass的前导密钥来配置数据库。

+1

+1我相信这是正确的答案。我认为,ON DELETE CASCADE可能会导致一些小问题,因为JPA提供商不会选择它。因此,如果您以后决定再次调用类似em.persist(child)的东西,JPA会认为它已经存在等等。另外,孩子不会从缓存中清除等。 – 2011-02-10 15:09:11

3

在JPA2中,您可以在@OneToOne注释上设置orphanRemoval = true。不过,我会说CascadeType.ALL应该处理该问题。如果您调用em.remove(parentClass)而不是调用查询,会怎样?