【发布时间】:2019-08-22 04:59:27
【问题描述】:
第一次尝试使用 Java Persistence 注解创建多对多关系。
场景:
Java 类Project 包含子项目,它只是Projects 的List。没有反向(没有超级项目)成员。所以我认为多对多关系非常适合这个
@ManyToMany(fetch = FetchType.EAGER, targetEntity = ProjectEntity.class, mappedBy = "project")
@Override
public List<ProjectImpl> getSubProjects() {
return super.getSubProjects();
}
Q1:这是用子项目列表持久化项目的正确方法吗?
Q2:另外,我目前收到错误:mappedby reference an unknown target property。我发现这个错误评价很高的线程:mappedBy reference an unknown target entity property 但是我这里没有一对多/多对一的逆或两个不同的类
编辑:根据反馈,我将关系更改为一对多,并根据 https://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#entity-mapping-association-collections 中的示例添加了 JoinTable 注释。但是我收到错误A Foreign key refering de.otsd.worklog.database.ProjectEntity from de.otsd.worklog.database.ProjectEntity has the wrong number of column. should be 2)
@OneToMany(fetch = FetchType.EAGER, targetEntity = ProjectEntity.class)
@JoinTable(
name = "ProjectToSubproject",
joinColumns = @JoinColumn(name = "project_id"),
inverseJoinColumns = @JoinColumn(name = "subproject_id")
)
@Override
public List<ProjectImpl> getSubProjects() {
return super.getSubProjects();
}
@EmbeddedId
@Override
public ProjectKey getProjectKey() {
return new ProjectKeyEntity(super.getProjectKey());
}
【问题讨论】:
-
多对多如何?一个子项目可以属于多个项目吗?
-
是的。这是一个边缘案例,但我不想排除这种可能性(例如,子项目由两个不同的超级项目计费和使用)
-
但是,如果
@OneToMany在这里绝对优越,那么这个选项对我来说并不是很重要:到目前为止,在实际项目中还没有发生这种边缘情况 -
您应该要么用户一对多或使用连接表进行多对多。一对多意味着子项目在表中获得一个外键来引用父项目。因为他们只能在该字段中存储一个表,所以它是 one 对多的。另一方面,多对多使用存储父键和子项目键对的连接表,因此能够存储具有多个父项的同一个子项目。一对多和多对多指的是数据的关系表示(不是OO表示
-
您的错误消息很可能意味着您的数据库架构与映射不匹配。当您更改映射时,您需要更改或重新创建数据库架构。
标签: java list jpa persistence