0

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PKB",nullable = false,unique=true)
private TableB tableb; 

}

所以表C和表A是多对一的关系,和表B是一对一的关系(通过唯一实现的就是“真”)

现在我的问题是,当我插入数据时,休眠首先插入表 B 数据,然后它试图插入表 c 数据并抛出错误不能在非空列中插入 Null。如果我将表 C 中的 PkA 设置为非空,则它正在正确插入所有数据。在休眠日志中,它正在按以下顺序触发 sql 语句
表 B 表 C 表 A。表 C 插入查询应在最后执行。任何帮助表示赞赏。

4

1 回答 1

0

每种关联都在 hibernate 文档中进行了描述,并附有示例。您应该阅读文档。

无论如何,这是您的映射存在的问题。

如果 B 和 C 之间存在一对一关联,则要使用的注释是@OneToOne@OneToOne。不是@OneToMany@ManyToOne。当然,你应该有一个类型TableCTableB字段而不是一个类型的字段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>();
于 2012-07-30T15:29:16.437 回答