我有一个自引用表,在我的对象模型中,对象只知道他们的父级,而不是他们的孩子。
我希望在创建子项时创建父节点。 但删除子项时我不希望删除它们。 CascadeType.ALL仍然存在,但也会按预期删除。 CascadeType.PERSIST,不删除,但也无法持久化。
这是可能的还是我在寻找什么? 在我去的时候,我是否必须手动追踪树?
hibernate注释:
import javax.persistence.ManyToOne; @Entity @Table(name = "NODE") public class Node implements Cloneable { @Id @Column(name = "KEY") @SequenceGenerator(name = "NodeSeq", sequenceName = "NODE_SEQ", allocationSize=1) @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="NodeSeq") private long key; @ManyToOne (cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) @JoinColumn(name="parentkey",referencedColumnName="key") private Node parent; ... }我正在使用javax.persistance注释和hibernate 4.3.7
更新解决方案除了使用javax.persistence CascadeType之外,我还在使用hibernate session.save和saveOrUpdate。 这是一个需要避免的错误解决方案。 见mkyong
I have a self referential table and in my object model objects only know their parent, but not their children.
I want parent nodes to be created when children are created. But I do not want them deleted when children are deleted. CascadeType.ALL persists, but also deletes as expected. CascadeType.PERSIST, doesn't delete, but also fails to persist.
Is this possible or am I over looking something? Do I have to manually trace up the tree persisting as I go?
The hibernate annotations:
import javax.persistence.ManyToOne; @Entity @Table(name = "NODE") public class Node implements Cloneable { @Id @Column(name = "KEY") @SequenceGenerator(name = "NodeSeq", sequenceName = "NODE_SEQ", allocationSize=1) @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="NodeSeq") private long key; @ManyToOne (cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) @JoinColumn(name="parentkey",referencedColumnName="key") private Node parent; ... }I am using javax.persistance annotations and hibernate 4.3.7
Update on solution Along with using javax.persistence CascadeType, I was using hibernate session.save and saveOrUpdate. This is a buggy solution to be avoided. See mkyong
最满意答案
如果使用session.saveOrUpdate(node),则可以使用hibernate注释@Cascade:
@ManyToOne @Cascade({CascadeType.SAVE_UPDATE}) @JoinColumn(name="parentkey",referencedColumnName="key") private Node parent;If you use session.saveOrUpdate(node) you can use the hibernate annotation @Cascade :
@ManyToOne @Cascade({CascadeType.SAVE_UPDATE}) @JoinColumn(name="parentkey",referencedColumnName="key") private Node parent;更多推荐
发布评论