休眠ManyToMany删除
问题描述:
我在删除内容时遇到了一些麻烦,当存在与另一个对象的多对多关系。休眠ManyToMany删除
要通过阵列每个实体进行删除我有一个名为查询的数组和删除,我循环并执行删除,实体,像这样:
private static final String[] DELETE_CONTENT_QUERY_NAMES = {
"Entity1.deleteByContentId",
"Entity2.deleteByContentId",
"Entity3.deleteByContentId",
"Entity4.deleteByContentId",
"Entity5.deleteByContentId",
"EntityWithManyToMany.deleteByContentId",
"Entity7.deleteByContentId",
"Content.DeleteByContent"
};
@Override
@Transactional
public void deleteContent(Content content) throws Exception{
Map<String, Object> params = new HashMap<String, Object>();
params.put("contentId", content.getContentId());
for (String queryName : DELETE_CONTENT_QUERY_NAMES) {
dao.batchDeleteByNamedQuery(queryName, params);
}
}
当迭代尝试执行EntityWithManyToMany.deleteByContentId HQL批量查询,我可以在日志中看到翻译后的sql指令,但后面跟着一组插入相同的行,MySQL正确地返回了我的约束错误。
这是我的多对多关系对象我试图删除:
@Entity
@Embeddable
public class CategoryContent implements java.io.Serializable {
/***
* Private Declarations
*/
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "contentId", column = @Column(
name = "CONTENT_ID",
nullable = false, precision = 10, scale = 0)),
@AttributeOverride(name = "categoryId", column = @Column(
name = "CATEGORY_ID",
nullable = false, precision = 10, scale = 0))
})
@NotNull
private CategoryContentId id;
@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.PERSIST)
@JoinColumn(name = "CATEGORY_ID", insertable=false, updatable=false)
private Category category;
@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.PERSIST)
@JoinColumn(name = "CONTENT_ID", insertable=false, updatable=false)
private Content content;
@Column(name = "PRIORITY", nullable = true)
private Integer priority;
}
你认为这是可能的问题关注CascadeType的?我该如何解决这个问题?
任何建议表示赞赏!
非常感谢, Davide。
答
你在正确的轨道上 - 尝试修改您的级联
cascade = {CascadeType.PERSIST, CascadeType.DELETE}
这应该工作,因为你有一个连接表。
不幸的是不工作,hibernate具有相同的行为 – Davide