我有以下hibernate entites:
@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 */
}
Run Code Online (Sandbox Code Playgroud)
和:
@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 */
}
Run Code Online (Sandbox Code Playgroud)
当我在DAO中删除实体«ModelView»时,我有异常:
ORA-01407: unable to replace ("MODEL_VIEW"."PAGE_ID") to NULL
Run Code Online (Sandbox Code Playgroud)
怎么了?为什么hibernate在删除之前将外键设置为NULL?
Jes*_*ebb 24
为什么hibernate在删除之前将外键设置为NULL?
Hibernate尝试通过将FK清空来取消引用您尝试删除的记录.不幸的是,在大多数情况下,FK不可归零.你必须告诉Hibernate ModelView在删除Page记录时不要更新实例.
试着改变insertable和updatable虚假的@JoinColumn映射page中ModelView:
@JoinColumn(name = "page_id", nullable = false, insertable = false, updatable = false)
Run Code Online (Sandbox Code Playgroud)
使用这些值时,ModelView记录将保留.同样,如果您强制执行参照完整性,这将不起作用.要解决这个问题,您需要打开删除级联.我注意到你的代码已经在使用CascadeType.ALL哪个应该可以正常工作.
这是一个SO Q&A,它解释了这些领域:
我有一个类似的问题,通过使用false这些值来解决.
如何在复合id键属性上映射"insert ='false'update ='false'",该属性也用于一对多FK?
| 归档时间: |
|
| 查看次数: |
16037 次 |
| 最近记录: |