Hibernate无法在表中输入外键值

时间:2012-07-30 13:35:21

标签: hibernate nhibernate-mapping hibernate-annotations

下面是我试图在我的代码中实现但不能继续进行的情况。由于此问题,我在过去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插入查询应该在最后执行。 任何帮助赞赏。

1 个答案:

答案 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>();