19

我有以下休眠实体:

@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

怎么了?为什么休眠在删除之前将外键设置为NULL?

4

1 回答 1

37

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

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

尝试在 in的映射上更改insertableandupdatable为 false :@JoinColumnpageModelView

@JoinColumn(name = "page_id", nullable = false, insertable = false, updatable = false)

使用这些值时,ModelView记录将保留。同样,如果您强制执行参照完整性,这将不起作用。要解决这个问题,您需要打开级联删除。我注意到在您的代码中您已经在使用CascadeType.ALL它应该可以正常工作。

这是一个 SO Q&A,它解释了这些字段:

在 JPA 中为什么以及如何使用可插入和可更新参数?

我有一个类似的问题,通过使用false这些值来解决。

如何将“insert='false' update='false'”映射到也用于一对多 FK 的复合 ID 键属性上?

于 2013-06-11T16:21:14.047 回答