2013-03-20 39 views
0

@OneToMany一些輕這是我的SQL表結構,需要使用地圖和@MapKeyColumn

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; 
    ... 
    .. 
} 

這是我測試的主要方法的代碼,

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); 

代碼工作正常順利進行

現在我的問題的所有插入是實體部門 在哪裏已經使用@MapKeyColumn(name =「xxxx」),其中「xxxx」是一些垃圾值, 這裏應該是什麼名字=? ,因爲在此之前它是名稱=「mobileNo」,這是Employee實體中的屬性。 這也工作。

那麼768,16是@MapKetColumn的actualy vaue(名稱=?)

回答

0

您應該參考Employee表的name列。

@MapKeyColumn(name="NAME") 
private Map<String,EmployeeEntityThree> employees; 
+0

但如果我把ID名稱值,它指的是自動生成員工實體的標識,所以在測試時我只能只插入一個emplyee即使我把3員工信息中的HashMap(), – 2013-03-20 10:24:20

+0

@Rahul Shivsharan,譁衆取寵,然後切換到名稱列,它需要成爲員工列。 – 2013-03-20 10:27:08

+0

的意思是,Employee表中的任何一列在其Java映射中保存唯一的哈希碼,對吧? – 2013-03-20 10:30:09