我有一个A
具有基本类型集合的实体(例如String
)。我使用这样的映射是因为与每个实例相关联的字符串A
依赖于A
的生命周期。如果我想A
从数据库中删除一个实例,我还希望删除其关联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;
}
如果我创建一个实例A
并为其添加一些字符串,那么我可以使用Session.save(myInstance)
. 的实例A
及其关联String
的 s 都被持久化。
但是,如果我想从数据库中删除相同的实例,使用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 策略,它在内部处理了这个。