如何在Hibernate中级联删除集合?

如何在Hibernate中级联删除集合?,hibernate,orm,coldfusion,cascade,coldfusion-9,Hibernate,Orm,Coldfusion,Cascade,Coldfusion 9,假设我有两个实体,一个Post和一个Comment(在ColdFusion中): Post有一组评论。现在我想删除一篇帖子,并自动删除评论。我尝试过简单的方法: var post = EntityLoadByPK("Post", 13); EntityDelete(post); 但是我得到了一个Hibernate错误,它说post\u id不能设置为null。我做错了什么,如何解决这个问题?您必须在DB中将注释表中的post_id设置为空。这就是hibernate执行级联删除的方式。它会将po

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

Post
有一组
评论
。现在我想删除一篇
帖子
,并自动删除
评论
。我尝试过简单的方法:

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

但是我得到了一个Hibernate错误,它说
post\u id
不能设置为null。我做错了什么,如何解决这个问题?

您必须在DB中将注释表中的post_id设置为空。这就是hibernate执行级联删除的方式。它会将post_id=13的所有注释设置为null,然后删除post_id为null的所有注释。您需要调整映射。尝试使comment的Post属性不为null,并将Post的Comments属性标记为inverse

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

考虑到这样做会破坏引用完整性,我非常确定这不是解决方案。我想知道是否有更好的方法,如果有。受这个答案及其评论的启发,我对配置选项进行了非常彻底的调查,并将结果发布在我的博客上:--最终,在我测试了所有不同的配置组合之后,我发现无法让Hibernate运行类似于
delete from comment的东西,其中blog=1;从id=1'
的博客中删除,而不使用类似HQL的内容。因此,只需不使用
entityDelete()
,就可以得到所需的结果。噢,注释应该是
cascade=“all delete orphan”
。不要忘了将一侧设置为
inverse=“true”
。我将此应用于测试,它开始按预期运行。
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";
}