在JPA中,我们可以将通用类型的Map映射到数据库。
以下代码定义了一个通用映射,其键值为Employee,值类型为Integer。
@ElementCollection
@CollectionTable(name="EMP_SENIORITY")
@MapKeyJoinColumn(name="EMP_ID")
@Column(name="SENIORITY")
private Map<Employee, Integer> seniorities;
下面的代码来自Department.java。
package com.lmonkey.common;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MapKeyJoinColumn;
@Entity
public class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
@ElementCollection
@CollectionTable(name="EMP_SENIORITY")
@MapKeyJoinColumn(name="EMP_ID")
@Column(name="SENIORITY")
private Map<Employee, Integer> seniorities;
public Department() {
seniorities = new HashMap<Employee, Integer>();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String deptName) {
this.name = deptName;
}
public Map<Employee, Integer> getEmployees() {
return seniorities;
}
public void setEmployeeSeniority(Employee employee, int seniority) {
seniorities.put(employee, seniority);
}
public void removeEmployee(Employee employee) {
seniorities.remove(employee);
}
public String toString() {
StringBuffer aBuffer = new StringBuffer("Department ");
aBuffer.append(" id: ");
aBuffer.append(id);
aBuffer.append(" name: ");
aBuffer.append(name);
aBuffer.append(" employeeCount: ");
aBuffer.append(seniorities.size());
return aBuffer.toString();
}
}
下面的代码来自PersonDaoImpl.java。
package com.lmonkey.common;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class PersonDaoImpl {
public void test() {
Employee e = new Employee();
e.setName("Tom");
Department d = new Department();
d.setName("test");
d.getEmployees().put(e, e.getId());
em.persist(e);
em.persist(d);
}
@PersistenceContext
private EntityManager em;
}
这里是数据库表转储。
Table Name: DEPARTMENT
Row:
Column Name: ID,
Column Type: INTEGER:
Column Value: 1
Column Name: NAME,
Column Type: VARCHAR:
Column Value: test
Table Name: EMPLOYEE
Row:
Column Name: ID,
Column Type: INTEGER:
Column Value: 1
Column Name: NAME,
Column Type: VARCHAR:
Column Value: Tom
Column Name: SALARY,
Column Type: BIGINT:
Column Value: 0
Table Name: EMP_SENIORITY
Row:
Column Name: DEPARTMENT_ID,
Column Type: INTEGER:
Column Value: 1
Column Name: SENIORITY,
Column Type: INTEGER:
Column Value: 0
Column Name: EMP_ID,
Column Type: INTEGER:
Column Value: 1
© 著作权归作者所有