我想在PostgreSQL中执行以下操作(使用Hibernate):
ALTER TABLE fruits ADD CONSTRAINTS id ON DELETE CASCADE;
字符串
显然,我上面的代码不起作用,所以我正在寻找正确的语句。
如果我不能做到这一点,那么以下几点如何:
我的表fruits
中有一堆数据。fruits
中的id
字段被表grapes
用作外键。我需要删除fruits
中的特定行,并且我希望删除级联到grapes
,并删除grapes
中具有指定id
的所有条目。如何执行?
delete from fruits where id = 1 cascade;
型
注意事项:我不想做一个连接,然后删除grape
中相应的数据。这只是一个例子。在真实的应用中,大量的表依赖于fruits
。
既然我使用的是Hibernate,那么当我使用一个delete语句时,Hibernate可以帮助我吗?
或者我可以用PostgreSQL中的信息模式或系统目录来做这件事吗?
4条答案
按热度按时间k3fezbri1#
您所描述的是使用
ON DELETE CASCADE
选项的教科书外键约束。在SQL中,您可以在场景中创建表
grapes
时隐式创建:字符串
或者你可以稍后添加:
型
不要直接为此编辑系统目录。请使用专用的DDL命令。
请注意,外键约束要求引用列上有唯一索引或主索引(在本例中为
fruits.fruit_id
),并强制执行referential integrity。jpfvwuh42#
这是一个单向的父子关系,你希望父级的更改向下级联到子级,而不是相反。使用注解,我们可以实现这一点。在
fruits
实体中:字符串
在“葡萄”实体中:
型
当您更新或删除父
fruit
时,更改将自动级联到grape
子节点。ha5z0ras3#
我找到了答案:
字符串
bkhjykvo4#
动机
这对我不起作用,我设置了
字符串
并且输出没有像
...ON DELETE CASCADE...
这样的状态。我找到了另一个适合我的解决方案:
让我们假设你有一个作者类和一个作者的书类,你想在删除作者时自动删除所有的书(通过hibernate,sql-query,.),并且有一些原因你不能(总是)通过session.delete()删除。
也许是吧:
型
解决方案
所以你的作者类可能看起来像这样:
型
课本是这样的:
型
诀窍是使用
型
然后添加
型
到你的 hibernate.cfg.xml(不要忘记 * hibernate.hbm2ddl.auto *)。然后 update.sql 包含表约束的更新:
型
因此,hibernate总是能够删除/更改约束,因为它知道约束的名称-您还应该检查@Cascade设置-并且您必须实现如何处理会话中对象删除的策略!