下面是我试图在代码中实现但无法继续的场景。由于这个问题,我在过去的3天里被卡住了
表A、B、C
表A{
colmnn PKA
柱试验;
@OneToMany
@Cascade( { org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
@JoinColumn(name = "PKA")
private Collection<TableC> tablec= new ArrayList<TableC>();
}
表B{
PKB列
柱测试2
@OneToMany(mappedBy = "tablec",fetch=FetchType.LAZY)
@Cascade( { org.hibernate.annotations.CascadeType.ALL,org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private List tableC= new ArrayList(); //List is used only for Hibernate mapping
}
表c{
PKC 列
@ManyToOne@JoinColumn(name="PKA")private TableA TableA;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PKB",nullable = false,unique=true)
private TableB tableb;
}
因此,表C与表A有多对一的关系与表B的一对一关系(通过unique is"true"实现)
现在我的问题是插入数据时Hibernate首先插入表B的数据,然后尝试插入表c的数据,并抛出错误。不能在非Null列中插入Null。如果我将表C中的PkA设为非空,则表示正确插入了所有数据。在hibernate日志中,它按以下顺序启动sql语句
表B表C表A表C插入查询应该最后执行。感谢任何帮助。
hibernate文档中描述了每种关联,并提供了示例。您应该阅读文档。
无论如何,以下是您的映射存在的问题。
如果B和C之间有一对一的关联,则要使用的注释是@OneToOne
和@OneToOne
。不是@OneToMany
和@ManyToOne
。当然,在TableB
中应该有一个TableC
类型的字段,而不是List<TableC>
类型的字段。
当您具有双向OneToOne或OneToMany关联时,其表中包含外键的一侧必须是所有者一侧。另一侧必须是内侧面。相反,必须有一个mappedBy
属性,而没有JoinColumn
注释。因此,在表A中,与表C的关联应该这样定义:
@OneToMany(mappedBy = "tableA")
@Cascade( { org.hibernate.annotations.CascadeType.ALL,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
private Collection<TableC> tablec= new ArrayList<TableC>();