Hibernate无法在表中输入外键值



下面是我试图在代码中实现但无法继续的场景。由于这个问题,我在过去的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>();

相关内容

  • 没有找到相关文章

最新更新