【问题标题】:How do I cascade delete a collection in Hibernate?如何在 Hibernate 中级联删除集合?
【发布时间】:2011-11-23 05:55:40
【问题描述】:

假设我有两个实体,一个 Post 和一个 Comment(在 ColdFusion 中):

component persistent="true" table="post"
{
    property name="Id" fieldtype="id";
    property name="Comments" fieldtype="one-to-many" cfc="Comment" fkcolumn="post_id" cascade="all";
}

component persistent="true" table="comment"
{
    property name="Id" fieldtype="id";
    property name="Post" fieldtype="many-to-one" cfc="Post" column="post_id";
}

Post 有一个Comments 的集合。现在我想删除Post,并自动删除Comments。我尝试了简单的方法:

var post = EntityLoadByPK("Post", 13);
EntityDelete(post);

但是我收到了一个休眠错误,提示 post_id 不能设置为 null。我做错了什么,我该如何解决这个问题?

【问题讨论】:

  • 哦,评论应该是cascade="all-delete-orphan"。并且不要忘记将一侧设置为inverse="true"

标签: hibernate orm coldfusion cascade coldfusion-9


【解决方案1】:

您需要调整映射。尝试使评论的 Post 属性不为空,并将 post 的 Comments 属性标记为反向。

component persistent="true" table="post"
{
  property name="Id" fieldtype="id";
  property name="Comments" fieldtype="one-to-many" cfc="Comment" fkcolumn="post_id" cascade="all" inverse="true";
}

component persistent="true" table="comment"
{
  property name="Id" fieldtype="id";
  property name="Post" fieldtype="many-to-one" cfc="Post" column="post_id" notnull="true";
}

【讨论】:

  • 我将它应用到我的测试中,它开始按预期执行。
【解决方案2】:

您必须在您的数据库中使评论表中的 post_id 为空。这就是hibernate如何级联删除。它将所有 post_id = 13 的 Comments 设置为 null,然后删除所有 post_id 为 NULL 的 cmets

【讨论】:

  • 我很确定这不是解决方案,因为这样做会破坏参照完整性。
  • 我也想知道有没有更好的方法。
  • 受这个答案及其 cmets 的启发,我对配置选项进行了相当彻底的调查,并将结果发布在我的博客上:fusiongrokker.com/post/on-cascaded-hibernate-deletes——最终,在我测试了所有不同的配置组合之后,我发现在不使用 HQL 之类的东西的情况下,没有办法让 Hibernate 运行delete from comment where blog=1; delete from blog where id=1' 之类的东西。所以有可能得到想要的结果,而不是使用entityDelete()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 2015-04-27
  • 2011-08-25
  • 2013-10-11
  • 1970-01-01
  • 2020-08-12
  • 2014-11-16
相关资源
最近更新 更多