级联删除可嵌入对象的集合

Mic*_*che 8 java hibernate cascading-deletes

我有一个A具有基本类型集合的实体(例如String).我使用这样的映射,因为与每个实例关联的字符串A依赖于A生命周期.如果我想A从DB中删除一个实例,我也希望String删除它的关联s.

我的映射如下:

@Entity
public class A {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "name", nullable = false, unique = true)
    private String name;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "AStrings", joinColumns = @JoinColumn(name = "id"))
    @Column(name = "strings", nullable = false)
    private Set<String> strings;
}
Run Code Online (Sandbox Code Playgroud)

如果我创建一个实例A并添加一些字符串,那么我可以使用持久化实例Session.save(myInstance).实例A及其关联的Strings都是持久的.

但是,如果我想从数据库中删除相同的实例,使用Session.createQuery("delete A a where a.name = ?").setString(0, name).executeUpdate(),我得到一个外键约束错误:

无法删除或更新父行:外键约束失败

但是,我希望String在删除A实例之前自动删除关联的s,但似乎并非如此.我也没有找到指定级联规则的方法.

我的配置有问题吗?

谢谢


编辑: 我也尝试过使用@Cascade(CascadeType.DELETE)该领域strings,它仍然没有帮助.通过查看数据库,我没有看到ON DELETE有关外键的任何政策.

有同样问题的人开了一个JIRA:https://hibernate.onjira.com/browse/HHH-4301.必须存在解决方案(或解决方法),我不能成为唯一使用的人@ElementCollection.

我已经解决了这个问题.我认为使用Session.delete()或使用HQL查询进行删除是等效的,但似乎没有.使用HQL查询,不会自动删除依赖对象,因此我得到外键约束错误.使用Session.delete()解决了这个问题.此外,Hibernate似乎没有使用数据库的级联功能,因为我仍然没有在生成的DDL中看到任何CASCADE策略,它在内部处理它.

Mic*_*che 7

我已经解决了这个问题.

我认为使用Session.delete()或使用HQL查询删除实体是等效的,但似乎没有.使用HQL查询,依赖对象不会被自动删除,因此我得到了一个外键约束错误,如问题中所述.

使用Session.delete()解决了问题.此外,Hibernate似乎没有使用数据库的级联功能,因为我仍然没有在生成的DDL中看到任何CASCADE策略,它在内部处理它.


对于主持人:

我已经在过去添加了我对问题的答案(正如你的要求),但由于这是解决问题的答案,并且没有发布任何答案(来自其他用户),我想我应该在这里作为答案发布.