对@OneToMany关系的外键约束

时间:2017-05-24 08:59:00

标签: postgresql hibernate

我想确保我理解我在数据库表示中所做的事情。与休眠。

我的项目管理工具可让我的用户创建一个由Project组成的Phase

我不想创建一个链接表,并且在我的实体中继续这样做:

我的ProjectEntity

@OneToMany(mappedBy = "id")
private Set<PhaseEntity> phases = new HashSet<>(0);

和我的PhaseEntity

@NotNull
@ManyToOne(targetEntity = ProjectEntity.class)
private ProjectEntity project;

填写我的PhaseEntity后,通过我的DAO

保存

phaseDao.save(phaseEntity);

我收到以下错误:

  

错误:在表“插入”上插入或更新违反外键约束“fk8x1x98c4hq4ps0d30y6nxe90u”     细节:表(“项目”)中没有键(phase_id)=(1820)。

我看到它的方式,将包含特定ProjectEntity的阶段推送到我的数据库应该创建1个条目并更新另一个条目,第一个应该是我的phase条目,后者应该是通过向其project添加相位来更新为Set

我是否必须在我的project表中明确保存我的阶段? 你在推理中看到任何瑕疵吗?

1 个答案:

答案 0 :(得分:0)

只是分享知识!

“由阶段组成的项目” 因此,如果要在“阶段”表中插入阶段,则需要在Project表中具有一个角色,该阶段具有与“阶段”表中新插入行的“class”列值相同的“class”列值。

外键是引用另一个表的列(通常是主键)的一列(或多列)。外键的目的是确保数据的引用完整性。换句话说,只允许出现在数据库中的值。

我们有两个表,一个包含所有项目的Project表,以及一个包含所有阶段的Phase表。由阶段组成的项目。为了强制执行此逻辑,我们在Phase表上放置一个外键,并让它引用Project表的主键。这样,我们可以确保Phase表中的所有阶段都与Phase表中的项目相关。换句话说,Phases表不能包含项目表中不在项目中的信息。