Java 多对多关系中的额外字段
在使用hibernate的spring mvc应用程序中,我在Java 多对多关系中的额外字段,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,在使用hibernate的spring mvc应用程序中,我在患者实体和组织实体之间有一个多个关系。此关系由名为organizationpatientjunction的连接表管理,该表包含指向Patient的整数id和Organization的字符串root的链接。问题是每个组织都有自己的患者唯一id,我希望能够保存、存储和检索患者/组织组合的每个唯一id。如何重新编写下面的代码,以便检索给定组织的/患者组合的orgpatientid @Entity @Table(name = "patient
患者
实体和组织
实体之间有一个多个
关系。此关系由名为organizationpatientjunction
的连接表管理,该表包含指向Patient
的整数id
和Organization
的字符串root
的链接。问题是每个组织
都有自己的患者
唯一id,我希望能够保存、存储和检索患者
/组织
组合的每个唯一id。如何重新编写下面的代码,以便检索给定组织的/患者组合的orgpatientid
@Entity
@Table(name = "patient")
public class Patient {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
public Integer id;
@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="organizationpatientjunction",
joinColumns={@JoinColumn(name="patient_id")},
//do I add something here for the other organization's own patient id?
inverseJoinColumns={@JoinColumn(name="org_id")})
private Set<Organization> providerorganizations = new HashSet<Organization>();
//getters and setters
}
@Entity
@Table(name = "organization")
public class Organization {
@Id
@Column(name="root")
private String root;
@Column(name="name")
private String name;
@ManyToMany(mappedBy="providerorganizations")
private Set<Patient> patients = new HashSet<Patient>();
//getters and setters
}
CREATE TABLE IF NOT EXISTS patient(
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
#other fields
)engine=InnoDB;SHOW WARNINGS;
CREATE TABLE IF NOT EXISTS organization(
root varchar(100) NOT NULL PRIMARY KEY,
name varchar(200)
)engine=InnoDB;SHOW WARNINGS;
CREATE TABLE IF NOT EXISTS organizationpatientjunction(
patient_id int(11) UNSIGNED NOT NULL,
org_root varchar(100) NOT NULL,
# Do I add orgpatientid varchar(100) here to store the other organization's patient id?
FOREIGN KEY (patient_id) REFERENCES patient(id),
FOREIGN KEY (org_root) REFERENCES organization(root)
)engine=InnoDB;SHOW WARNINGS;
@实体
@表(name=“患者”)
公立病人{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
公共整数id;
@ManyToMany(cascade={CascadeType.ALL})
@JoinTable(name=“organizationpatientjunction”,
joinColumns={@JoinColumn(name=“patient_id”)},
//我是否在此处为其他组织自己的患者id添加内容?
inverseJoinColumns={@JoinColumn(name=“org\u id”)})
私有集providerorganizations=new HashSet();
//接球手和接球手
}
@实体
@表(name=“组织”)
公营班级组织{
@身份证
@列(name=“root”)
私有字符串根;
@列(name=“name”)
私有字符串名称;
@ManyToMany(mappedBy=“providerorganizations”)
private Set patients=new HashSet();
//接球手和接球手
}
如果不存在患者,则创建表格(
id int(11)无符号非空自动增量主键,
#其他领域
)引擎=InnoDB;显示警告;
如果组织不存在,则创建表(
根varchar(100)非空主键,
名称varchar(200)
)引擎=InnoDB;显示警告;
如果不存在,则创建表organizationpatientjunction(
患者id int(11)未签名非空,
org_root varchar(100)不为空,
#我是否在此处添加orgpatientid varchar(100)以存储其他组织的患者id?
外键(患者id)引用患者(id),
外键(组织根)引用组织(根)
)引擎=InnoDB;显示警告;
在对象模型中,应将集合更改为贴图
现在您有两个选择:
使用值对象(可嵌入JPA)作为地图的值类型-例如字符串
将实体用作值类型
本javadoc将两个选项描述为示例2和3:
在代码中,您还具有从组织到个人的反向关联(反向映射)。这是必需的吗?我建议移除它,尽管这是可能的。但是,您也应该将其更改为“映射”,并相应地映射它
@ElementCollection@CollectionTable(name=“organizationpatientjunction”,joinColumns={@JoinColumn(name=“patient\u id”)})
@列(name=“患者编号”)
@MapKeyJoinColumn(name=“org\u root”)
私有映射提供程序组织=
公共字符串GetPatientNumber for(组织o){
返回providerorganizations.get(o);
}
您应该先删除反向映射(删除集合),然后再尝试正确映射。谢谢。我读了你的链接,但我仍然感到困惑。我花了一整天的时间从多个角度修补这个问题,但我还没有接近解决它。你能给我看一下解决这个问题的显式代码吗?我认为这是我理解这一点的唯一方法。除了不知道如何在实体定义中设置关系外,我还不知道如何设置getter和setter。您发送的文档不清楚。我正在手机上编写此文档,因此很难编写正确的代码,也无法进行测试。我会尽我所能的,谢谢。我真的不明白,这给我造成了一个瓶颈。非常感谢您的帮助。我想我想要javadoc中的示例3(使用实体作为值类型),但它不显示数据库表的DDL,也不显示getter和setter。另外,我不知道如何在我上面的原始帖子中将其全部翻译给我的患者和组织实体。最后,我希望能够从存储患者和组织之间关系的任何连接表中保存、存储和检索orgpatientid值。