我正在尝试多对多关系,团队成员可以处理多个项目,一个项目可以有多个团队成员,表结构如下,
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)
)
这里我创建了一个新表来存储关系, 现在请关注员工实体,
@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<ProjectEntityOne,String> employeeCadre;
...
..
.
}
请遵循Project Entity的映射,
@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<EmployeeEntityFour,String> employeeCadre;
....
..
.
}
在主方法测试中,编写的代码如下,
ProjectEntityOne proj = new ProjectEntityOne("Citi Grand Central");
Map<EmployeeEntityFour,String> cadreMap = new HashMap<EmployeeEntityFour,String>();
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的两个实体中,我得到的错误是第三个表的不正确的列。
我失踪的地方
答案 0 :(得分:1)
它以某种方式工作,我不得不在代码中做一些更改,
首先,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<EmployeeEntityFour,String> employeeCadre;
我在这里做的是在@CollectionTable中添加@JoinedColumn,
我在Entity EmployeeEntityFour中做了第二次更改,更改是我从中删除了PorjectEntityOne的地图,
在测试中, 我可以使用Employee映射保存Project,但是这里所有员工都应该已经保存了一个。 即地图的关键
Map<EmployeeEntityFour,String> employeeCadre;
应该已经持久化了 而且我们可以坚持项目实体。
答案 1 :(得分:0)
在EmployeeEntityFour中的employeeCadre上,您需要@JoinColumn(name =“MEMBER_ID”),并且您还需要ProjectEntityOne employeeCadre中的@JoinColumn(name =“PRJ_ID”)。
但是,我不会这样建模。首先,您不能拥有双向ElementCollection映射,而ElementCollection只能由一方拥有。最好的解决方案是定义一个Cadre实体映射到EMP_PRJ_CADRE表并从两侧获得一个OneToMany,并让每个实体都有一个ManyToOne。
或者你可以使用带有MapKeyColumn的ManyToMany,但我认为你最好有一个实体。