Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java持久性:@ManyToMany要列出的项目<;项目>;_Java_List_Jpa_Persistence - Fatal编程技术网

Java持久性:@ManyToMany要列出的项目<;项目>;

Java持久性:@ManyToMany要列出的项目<;项目>;,java,list,jpa,persistence,Java,List,Jpa,Persistence,首次尝试使用Java持久性注释创建多对多关系 情景: Java类Project包含子项目,它只是项目的列表。没有反向(无超级项目)成员。所以我认为多对多的关系将是完美的 @ManyToMany(fetch = FetchType.EAGER, targetEntity = ProjectEntity.class, mappedBy = "project") @Override public List<ProjectImpl> getSubProjects() { re

首次尝试使用Java持久性注释创建多对多关系

情景: Java类
Project
包含子项目,它只是
项目的
列表
。没有反向(无超级项目)成员。所以我认为多对多的关系将是完美的

@ManyToMany(fetch = FetchType.EAGER, targetEntity = ProjectEntity.class, mappedBy = "project")    
@Override
public List<ProjectImpl> getSubProjects() {
    return super.getSubProjects();
}

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

它是多少对多?一个子项目是否可以属于多个项目?是。这是一个边缘案例,但我不想排除可能性(例如,子项目由两个不同的超级项目计费和使用),如果
@OneToMany
在这里绝对优越,那么这个选项对我来说就不是很重要了:在实际项目中,目前为止还没有出现这种情况。您应该使用一对多或使用多对多的联接表。ont to many意味着子项目在表中获得一个外键来引用父项目。因为他们只能在该字段中存储一个表,所以是一对多。另一方面,多对多使用一个连接表,该表存储父项和子项目项对,因此能够存储具有多个父项的同一个子项目。“一对多”和“多对多”指的是数据的关系表示(不是OO表示)。您的错误信息很可能意味着您的db模式与映射不匹配。更改映射时,您需要更改或重新创建数据库模式。嗯,当我将注释更改为
@manytomy时(fetch=FetchType.EAGER,targetEntity=ProjectEntity.class)
在保持其他一切不变的情况下,我收到大量警告,例如
警告:GenerationTarget遇到异常接受命令:执行DDL“alter table project\u project drop FORING key FK4…”时出错通过JDBC语句
-还有什么我需要做的吗?您应该指定链接表。当存在“mappedBy”时,它假设它是反向关系,并且“real”关系是在另一侧的字段上指定的。但在您的情况下,您必须在此处指定关系。顺便问一下,数据库表是什么样子的?它们是通过hibernate架构导出还是手动创建的?基于此文档,使用
@JointTable
更新main post,我使用hilbernate创建所有表
@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());
}