【问题标题】:Java Persistence: @ManyToMany Project to List<Projects>Java 持久性:@ManyToMany 项目列表<Projects>
【发布时间】:2019-08-22 04:59:27
【问题描述】:

第一次尝试使用 Java Persistence 注解创建多对多关系。

场景: Java 类Project 包含子项目,它只是ProjectsList。没有反向(没有超级项目)成员。所以我认为多对多关系非常适合这个

@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


【解决方案1】:

我猜你根本不需要 mappedby,因为它不是双向的。您可能应该指定用于多对多的链接表(除非您将其更改为一对多)。

【讨论】:

  • 嗯,当我将注释更改为 @ManyToMany(fetch = FetchType.EAGER, targetEntity = ProjectEntity.class) 并保持其他所有内容相同时,我会收到大量警告,例如WARN: GenerationTarget encountered exception accepting command: Error executing DDL " alter table project_project drop foreing key FK4..." via JDBC Statement - 还有什么我需要做的吗?
  • 你应该指定链接表。当“mappedBy”存在时,它假定它是反向关系,并且“真实”关系是在另一侧的字段上指定的。但在您的情况下,您必须在此处指定它。
  • 顺便问一下,数据库表是什么样子的,它们是通过休眠模式导出还是手动创建的?
  • 根据本文档docs.jboss.org/hibernate/stable/annotations/reference/en/html/… 使用@JointTable 更新主帖,我使用hibernate 创建所有表
猜你喜欢
  • 1970-01-01
  • 2013-06-24
  • 2012-07-22
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多