删除实体时,Hibernate将外键设置为null

时间:2013-06-11 16:16:25

标签: hibernate

我有以下的冬眠行为:

@Entity
@Table(name = "model_view")
public class ModelView {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "modelView_id")
    private Integer id;

    @ManyToOne
    @NotNull
    @JoinColumn(name = "page_id", nullable = false, insertable = true, updatable = true)
    private Page page;

    /* getters and setters */
}

@Entity
public class Page {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "page_id")
    private Integer id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "page_id")
    @IndexColumn(name = "modelView_id")
    private Set<ModelView> modelViews = new HashSet<ModelView>();

    /* getters and setters */
}

当我在DAO中删除实体«ModelView»时,我有异常:

ORA-01407: unable to replace ("MODEL_VIEW"."PAGE_ID") to NULL

有什么问题?为什么hibernate在删除之前将外键设置为NULL?

1 个答案:

答案 0 :(得分:24)

  

为什么hibernate在删除之前将外键设置为NULL?

Hibernate尝试通过将FK清空来取消引用您尝试删除的记录。不幸的是,在大多数情况下,FK不可归零。在删除ModelView记录时,您必须告诉Hibernate不要更新Page实例。

尝试在insertable updatable的{​​{1}}映射中将@JoinColumnpage更改为false:

ModelView

使用这些值时,@JoinColumn(name = "page_id", nullable = false, insertable = false, updatable = false) 记录将保留。同样,如果您强制执行参照完整性,这将不起作用。要解决这个问题,您需要打开删除级联。我注意到在你的代码中你已经使用了ModelView,这应该可以正常工作。

这是一个SO Q&amp; A,它解释了这些领域:

In JPA why and how to use insertable and updatable parameter?

我遇到了类似的问题,使用CascadeType.ALL来解决这些问题。

How can I map "insert='false' update='false'" on a composite-id key-property which is also used in a one-to-many FK?