gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:31 26 4
gpt4 key购买 nike

我有一个实体 A,它有一组基本类型(例如 String)。我使用这样的映射是因为与 A 的每个实例关联的字符串取决于 A 的生命周期。如果我想从数据库中删除 A 的实例,我还希望删除其关联的 String

我的映射如下:

@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;
}

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

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

Cannot delete or update a parent row: a foreign key constraint fails

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

我的配置有问题吗?

谢谢


编辑: 我也试过在字段 strings 上使用 @Cascade(CascadeType.DELETE),但它仍然没有帮助。通过查看数据库,我没有看到有关外键的任何 ON DELETE 策略。

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

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

最佳答案

我已经解决了这个问题。

我认为使用 Session.delete() 或使用 HQL 查询删除实体是等效的,但似乎不是。使用 HQL 查询,依赖对象不会自动删除,所以我得到了问题中解释的外键约束错误。

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


对于版主:

我已经在过去添加了我对问题的回答(如您所问),但由于这是解决问题的答案并且没有发布(来自其他用户的)答案,我认为我应该将其发布在这里作为答案。

关于java - 可嵌入对象集合的级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12172971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com