Java 需要使用Map和@MapKeyColumn了解@oneToMany吗
这是我的sql表结构Java 需要使用Map和@MapKeyColumn了解@oneToMany吗,java,jpa,jpa-2.0,Java,Jpa,Jpa 2.0,这是我的sql表结构 create table TBL_DEPARTMENT_ONE( ID integer primary key generated always as identity (start with 50, increment by 1), name varchar(100) ) create table TBL_EMPLOYEE_THREE( ID integer primary key generated always as identity (s
create table TBL_DEPARTMENT_ONE(
ID integer primary key generated always as identity (start with 50, increment by 1),
name varchar(100)
)
create table TBL_EMPLOYEE_THREE(
ID integer primary key generated always as identity (start with 100, increment by 1),
name varchar(100),
dept_ID integer references TBL_DEPARTMENT_ONE
)
在这里,我们在员工和部门之间建立了一种一对多的关系结构,其中许多员工可以属于一个部门
现在,这里是JPA映射代码,如下所示,
对于员工来说
@Entity
@Table(name="TBL_EMPLOYEE_THREE")
public class EmployeeEntityThree implements Serializable{
public EmployeeEntityThree(){}
public EmployeeEntityThree(String name,String mobileNo,DepartmentEntityOne dept){
this.empName = name;
this.department = dept;
this.mobileNo = mobileNo;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private Integer employeeId;
@Column(name="MOBILE_NO")
private String mobileNo;
@ManyToOne(cascade={CascadeType.PERSIST,
CascadeType.MERGE},
fetch= FetchType.LAZY,targetEntity=DepartmentEntityOne.class)
@JoinColumn(name="DEPT_ID")
private DepartmentEntityOne department;
.....
...
}
以下代码为部门实体代码
@Entity
@Table(name="TBL_DEPARTMENT_ONE")
public class DepartmentEntityOne implements Serializable{
public DepartmentEntityOne(){ }
public DepartmentEntityOne(String name){
this.deptName = name;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID")
private Integer deptId;
@Column(name="NAME")
private String deptName;
@OneToMany(cascade= { CascadeType.MERGE,
CascadeType.PERSIST},
fetch= FetchType.LAZY,mappedBy="department")
@MapKeyColumn(name="xxxxx")
private Map<String,EmployeeEntityThree> employees;
...
..
}
@实体
@表(name=“TBL\U部门\U一”)
公共类DepartmentEntityOne实现可序列化{
公共部门EntityOne(){}
公共部门EntityOne(字符串名称){
this.deptName=名称;
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“ID”)
私有整数deptId;
@列(name=“name”)
私有字符串deptName;
@OneToMany(cascade={CascadeType.MERGE,
CascadeType.PERSIST},
fetch=FetchType.LAZY,mappedBy=“department”)
@MapKeyColumn(name=“xxxxx”)
私人Map员工;
...
..
}
这是我主要测试方法中的代码
DepartmentEntityOne deptOne = new DepartmentEntityOne("Mechanical Engineering");
Map<String,EmployeeEntityThree> empMap = new HashMap<String,EmployeeEntityThree>();
EmployeeEntityThree[] array = new EmployeeEntityThree[]{
new EmployeeEntityThree("Amar","9000000001",deptOne),
new EmployeeEntityThree("Akbar","9000000002",deptOne),
new EmployeeEntityThree("Anthony","9000000003",deptOne)
};
empMap.put(array[0].getMobileNo(),array[0]);
empMap.put(array[1].getMobileNo(),array[1]);
empMap.put(array[2].getMobileNo(),array[2]);
deptOne.setEmployees(empMap);
em = emf.createEntityManager();
em.persist(deptOne);
DepartmentEntityOne deptOne=新的DepartmentEntityOne(“机械工程”);
Map empMap=newhashmap();
EmployeeEntityThree[]数组=新EmployeeEntityThree[]{
新员工实体三(“Amar”、“900000001”、deptOne),
新员工实体三(“Akbar”、“900000002”、deptOne),
新员工实体三(“安东尼”,“900000003”,德普顿)
};
put(数组[0].getMobileNo(),数组[0]);
put(数组[1].getMobileNo(),数组[1]);
put(数组[2].getMobileNo(),数组[2]);
SETEMPLOYES(empMap);
em=emf.createEntityManager();
em.persist(deptOne);
代码可以正常工作,所有插入都成功完成
现在我的问题是实体部门
其中,is使用了@MapKeyColumn(name=“xxxx”),其中“xxxx”是一些垃圾值,
这里应该是什么名字=?
因为在此之前,它是name=“mobileNo”,这是雇员实体中的属性。
这也奏效了
那么@MapKetColumn(name=?)的实际值应该是什么呢?您应该参考
Employee
表的name
列
@MapKeyColumn(name="NAME")
private Map<String,EmployeeEntityThree> employees;
@MapKeyColumn(name=“name”)
私人Map员工;
但是如果我把id作为name值,它指的是员工实体的自动生成id,所以在测试时,我只能插入一个员工,即使我在HashMap()中输入了3个员工信息,@Rahul Shivsharan,哇,这很有意义,然后切换到name列,它需要是employee.means上的一列,Employee表中的任何列在其java映射中都包含唯一的哈希代码,对吗?