下面是我试图在我的代码中实现但不能继续进行的情况。由于此问题,我在过去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
column test2;
@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”) 私人TableA tableA;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PKB",nullable = false,unique=true)
private TableB tableb;
}
因此,表C与表A和表有很多对一的关系 与表B的一对一关系(通过唯一实现是“真实的”)
现在我的问题是我在插入数据时
Hibernate首先插入表B数据后,它试图插入表c数据并抛出错误,无法在非空列中插入Null。
如果我在表C中使PkA为非null,则正确地插入所有数据。在hibernate日志中,它按以下顺序触发sql语句
表B表C表A.表C插入查询应该在最后执行。
任何帮助赞赏。
答案 0 :(得分:0)
每种关联都在hibernate文档中进行了描述,并附有示例。你应该阅读文档。
无论如何,这是您的映射存在的问题。
如果您在B和C之间存在一对一关联,则使用的注释为@OneToOne
和@OneToOne
。不是@OneToMany
和@ManyToOne
。当然,您应该在TableC
中使用TableB
类型的字段,而不是List<TableC>
类型的字段。
当您具有双向OneToOne或OneToMany关联时,其表中包含外键的一方必须是所有者方。另一方必须是补救方。相反,必须有mappedBy
属性,并且没有JoinColumn
注释。因此,在TableA中,与TableC的关联应该像这样定义:
@OneToMany(mappedBy = "tableA")
@Cascade( { org.hibernate.annotations.CascadeType.ALL,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
private Collection<TableC> tablec= new ArrayList<TableC>();