Hibernate @OnDelete каскадный же стол - PullRequest
2 голосов
/ 21 ноября 2011

Я пытаюсь создать таблицу, которая фиксирует родительские и дочерние отношения, например дерево. Я хотел бы сохранить только два столбца, чтобы захватить эту структуру "id" и "parent". Я хочу, чтобы база данных имела возможность каскадного удаления всех дочерних элементов при удалении строки. Ниже приведена созданная мной сущность Hibernate. Я добавил аннотацию @OnDelete(action = OnDeleteAction.CASCADE), однако ON DELETE CASCADE не добавляется в таблицу при ее создании с помощью Hibernate.

Это ошибка? Или я что-то упускаю или не понимаю?

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

1 Ответ

5 голосов
/ 21 ноября 2011

@OnDelete следует использовать на стороне @OneToMany:

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

Также вы пропустили mappedBy - требуется в двунаправленных отношениях.

...