我有以下的冬眠行为:
@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?
答案 0 :(得分:24)
为什么hibernate在删除之前将外键设置为NULL?
Hibernate尝试通过将FK清空来取消引用您尝试删除的记录。不幸的是,在大多数情况下,FK不可归零。在删除ModelView
记录时,您必须告诉Hibernate不要更新Page
实例。
尝试在insertable
updatable
的{{1}}映射中将@JoinColumn
和page
更改为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
来解决这些问题。