Hibernate级联

时间:2010-04-07 12:22:29

标签: java hibernate jpa cascade

Hibernate逆向工程生成的所有内容都是这样的

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "column_id")
    public Itinerary getColumnId() {
        return this.columnId;
    }

我想要这样的场景:当会话刷新时,首先保存所有构造的子节点,然后根据FK约束保存父对象。

当然,孩子需要先保存(自动!),因为有FK约束。

你告诉我:有一个CASCADE选项,但如何在JPA中使用它?

我尝试像这样添加级联:

    @ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.PERSIST)
    @JoinColumn(name = "column_id")
    public Itinerary getColumnId() {
        return this.columnId;
    }

对我不起作用。

首先告诉我:应该使用此指令注释什么以及如何使其工作。

我收到“无法添加或更新子行:外键约束失败”异常。

事实上,我不想手工坚持一切!只构造一个对象和 坚持下去!

要注释什么,使用什么指令以及如何使用?

3 个答案:

答案 0 :(得分:2)

尝试将级联注释放到映射的父端,例如

@OneToMany(cascade = { CascadeType.PERSIST, 
                       CascadeType.MERGE, 
                       CascadeType.REMOVE },
           mappedBy = "children")
private Set<Children> children = new HashSet<Children>();

您可能需要也可能不需要所有这些级联选项 - 选择您的选择。

以下是reference page以防万一。

答案 1 :(得分:1)

你真正需要的是

cascade=CascadeType.SAVE_UPDATE

但这不是JPA的一部分。所以你可以改用它:

cascade=CascadeType.ALL

它将包含SAVE_UPDATE(使用Hibernate实现)。但它可能包括你不喜欢的其他级联。

答案 2 :(得分:0)

您应该结合JPA和Hibernate的私有注释。请参阅documentation