使用@ElementCollection,@ MapKeyJoinColumn在执行多对多关系时引用密钥问题

我正在尝试多对多关系,团队成员可以处理多个项目,一个项目可以有多个团队成员,表结构如下,

create table TBL_PROJECT_ONE( id integer primary key generated always as identity(start with 12,increment by 3), name varchar(50) ) create table TBL_TEAM_MEMBER_ONE( id integer primary key generated always as identity(start with 7,increment by 5), name varchar(50), salary integer ) create table EMP_PRJ_CADRE( MEMBER_ID integer references TBL_TEAM_MEMBER_ONE, PRJ_ID integer references TBL_PROJECT_ONE, CADRE varchar(10), constraint PK_001_EMP_TEAM primary key (MEMBER_ID,PRJ_ID) ) 

在这里,我创建了一个新表来存储关系,现在请关注Employee实体,

 @Entity @Table(name="TBL_TEAM_MEMBER_ONE") public class EmployeeEntityFour implements Serializable{ public EmployeeEntityFour(){} public EmployeeEntityFour(String empName,Integer salary){ ... .. } @Id @GeneratedValue(strategy= GenerationType.IDENTITY) @Column(name="ID") private Integer empId; @Column(name="NAME") private String empName; @Column(name="SALARY") private Integer empSal; @ElementCollection(fetch= FetchType.LAZY) @CollectionTable(name="EMP_PRJ_CADRE") @MapKeyJoinColumn(name="PRJ_ID") @Column(name="CADRE") private Map employeeCadre; ... .. . } 

请按照项目实体的映射,

 @Entity @Table(name="TBL_PROJECT_ONE") public class ProjectEntityOne implements Serializable{ public ProjectEntityOne(){} public ProjectEntityOne(String name){ this.projectName = name; } @Id @GeneratedValue(strategy= GenerationType.IDENTITY) @Column(name="ID") private Integer projectId; @Column(name="NAME") private String projectName; @ElementCollection(fetch= FetchType.LAZY) @CollectionTable(name="EMP_PRJ_CADRE") @MapKeyJoinColumn(name="MEMBER_ID") @Column(name="CADRE") private Map employeeCadre; .... .. . } 

在主方法测试中编写的代码如下,

 ProjectEntityOne proj = new ProjectEntityOne("Citi Grand Central"); Map cadreMap = new HashMap(); cadreMap.put(new EmployeeEntityFour("Murlinarayan Muthu",34000), "Senior Software Engineer"); cadreMap.put(new EmployeeEntityFour("Gopalkrishna Rajnathan",64000), "Software Engineer"); cadreMap.put(new EmployeeEntityFour("Premanna Swaminathan",94000), "Project Manager"); proj.setEmployeeCadre(cadreMap); em.persist(proj); 

但我得到一个错误

 ERROR: 'PROJECTENTITYONE_ID' is not a column in table or VTI 'APP.EMP_PRJ_CADRE'. 

在我指定了@MapKeyJoinColumn的两个实体中,我得到的错误是第三个表的不正确的列。

我失踪的地方

在EmployeeEntityFour中的employeeCadre上,您需要@JoinColumn(name =“MEMBER_ID”),并且您还需要ProjectEntityOne employeeCadre中的@JoinColumn(name =“PRJ_ID”)。

但是,我不会这样模仿它。 首先,您不能拥有双向ElementCollection映射,而ElementCollection只能由一方拥有。 最好的解决方案是定义一个映射到EMP_PRJ_CADRE表的Cadre实体,并从两侧获得一个OneToMany,并让每个都有一个ManyToOne。

或者你可以使用带有MapKeyColumn的ManyToMany,但我认为你最好拥有一个实体。

它以某种方式工作,我不得不在代码中做一些更改,

首先,Entity ProjectEntityOne中编辑的代码如下,

 @ElementCollection(fetch= FetchType.LAZY) @CollectionTable(name="EMP_PRJ_CADRE",joinColumns=@JoinColumn(name="PRJ_ID")) @MapKeyJoinColumn(name="MEMBER_ID") @Column(name="CADRE") private Map employeeCadre; 

我在这里做的是在@CollectionTable中添加@JoinedColumn,

我在Entity EmployeeEntityFour中做了第二次更改,更改是我从中删除了PorjectEntityOne的Map,

在测试中,我可以使用Employee映射保存Project,但是这里所有员工都应该已经保存了一个。 即地图的关键

 Map employeeCadre; 

应该已经持久化,而且我们可以坚持项目实体。