【问题标题】:Hibernate @OnDelete cascade same tableHibernate @OnDelete 级联同一张表
【发布时间】:2012-01-02 20:13:49
【问题描述】:

我正在尝试创建一个捕获父子关系的表,例如一棵树。我想只保留两列来捕获这个结构“id”和“parent”。我希望数据库能够在删除一行时级联删除所有子项。下面是我创建的 Hibernate Entity,我添加了注解 @OnDelete(action = OnDeleteAction.CASCADE) 但是,当表由 Hibernate 创建时,ON DELETE CASCADE 没有添加到表中。

这是一个错误吗?还是有什么我遗漏或不理解的地方?

@Entity
public class Tree {

    @Id
    @Column(name = "id", nullable = false)
    private Long id;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "parent", nullable = true)
    private List<Tree> children;

    @ManyToOne
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JoinColumn(name = "parent", nullable = false)
    private Tree parent;

    public Tree(Long id) {
        this.id = id;
    }

    public Tree() {
    }

    public Long getId() {
        return id;
    }

    protected void setId(Long id) {
        this.id = id;
    }

    public List<Tree> getChildren() {
        return children;
    }

    public void setChildren(List<Tree> children) {
        this.children = children;
    }

    public Tree getParent() {
        return parent;
    }

    public void setParent(Tree parent) {
        this.parent = parent;
    }
}

【问题讨论】:

  • 您是否尝试将orphanRemoval=true 放在@OneToMany 集合中? (@ManyToOne)?
  • 嗨 Pitor,我试过了,但“ON DELETE CASCADE”仍未添加到表格中。

标签: hibernate jpa-2.0 cascade cascading-deletes hibernate-cascade


【解决方案1】:

@OnDelete应该用在@OneToMany边:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "parent")
@OnDelete(action = OnDeleteAction.CASCADE) 
private List<Tree> children; 

您也错过了mappedBy - 它是双向关系所必需的。

【讨论】:

  • 谢谢你,这很有效!我不得不删除 @JoinColum 注释,使它看起来像这样:@OneToMany(fetch = FetchType.EAGER, mappedBy = "parent") @OnDelete(action = OnDeleteAction.CASCADE) private List&lt;Tree&gt; children;
  • @Ali:是的,双向关系中的@JoinColumn应该放在@ManyToOne一侧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多