在您的情况下,您已将OneToMany作为company_id的拥有方。即,公司类别是所有者。
在这种情况下,插入一个应用程序记录将导致两次查询,一次插入和一次更新。首先是insert语句,该语句在没有company_id的情况下执行对App表的插入(因为这不是所有者),然后触发更新查询来更新company_id。因此,要使第一个插入语句成功,它要求company_id为数据库中的空字段。否则将抛出ConstraintViolationException。
如果将ManyToOne作为拥有方,那么它将在App表中生成单个insert语句。因此,在这种情况下,company_id字段可以为null。
因此,我看到两个选择:
将company_id设置为数据库中的空字段。
使ManyToOne作为拥有者。
以下输出有助于理解以上陈述。我有森林类,它与树类具有OneToMany关系。
拥有多对一的所有权
Hibernate: values identity_val_local() Hibernate: insert into Tree (id, "COUNT", FOREST, name, version) values (default, ?, ?, ?, ?)
一对多的所有权
Hibernate: insert into Tree (id, "COUNT", name, version) values (default, ?, ?, ?) Hibernate: values identity_val_local() Hibernate: update Tree set FOREST=?, index=? where id=?