JPA ElementCollection枚举映射示例
JPA教程 - JPA ElementCollection枚举映射示例
以下代码显示如何将带有枚举键值的Java java.util.Map保存到数据库。
PhoneType 是枚举类型。
@ElementCollection
@CollectionTable(name="EMP_PHONE")
@MapKeyEnumerated(EnumType.STRING)
@MapKeyColumn(name="PHONE_TYPE")
@Column(name="PHONE_NUM")
private Map<PhoneType, String> phoneNumbers = new HashMap();
例子
以下代码来自Employee.java。
package cn.w3cschool.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.EnumType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.MapKeyColumn;
import javax.persistence.MapKeyEnumerated;
enum PhoneType {
Home, Mobile, Work
}
@Entity
public class Employee {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
private long salary;
@ElementCollection
@CollectionTable(name="EMP_PHONE")
@MapKeyEnumerated(EnumType.STRING)
@MapKeyColumn(name="PHONE_TYPE")
@Column(name="PHONE_NUM")
private Map<PhoneType, String> phoneNumbers = new HashMap();
@ManyToOne
private Department department;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getSalary() {
return salary;
}
public void setSalary(long salary) {
this.salary = salary;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public Map<PhoneType, String> getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(Map<PhoneType, String> phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
public String toString() {
StringBuffer aBuffer = new StringBuffer("Employee ");
aBuffer.append(" id: ");
aBuffer.append(id);
aBuffer.append(" with dept: ");
if(null != department) {
aBuffer.append(department.getName());
}
aBuffer.append(" phoneNumbers: ");
for (Map.Entry e : phoneNumbers.entrySet()) {
aBuffer.append(e.getKey().toString() + "[" + e.getValue() + "] ");
}
return aBuffer.toString();
}
}
下面的代码来自PersonDaoImpl.java。
package cn.w3cschool.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.addEmployee(e);
d.setName("test");
e.setDepartment(d);
e.getPhoneNumbers().put(PhoneType.Home, "1231231231");
d.addEmployee(e);
em.persist(d);
em.persist(e);
}
@PersistenceContext
private EntityManager em;
}
下面的代码来自Department.java。
package cn.w3cschool.common;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
@Entity
public class Department {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy="department")
@OrderBy("name ASC")
private List<Employee> employees;
public Department() {
employees = new ArrayList<Employee>();
}
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 void addEmployee(Employee employee) {
getEmployees().add( employee);
if (employee.getDepartment() != null) {
employee.getDepartment().getEmployees().remove(employee.getName());
}
employee.setDepartment(this);
}
public List<Employee> getEmployees() {
return employees;
}
public String toString() {
StringBuffer aBuffer = new StringBuffer("Department ");
aBuffer.append(" id: ");
aBuffer.append(id);
aBuffer.append(" name: ");
aBuffer.append(name);
aBuffer.append(" employeeCount: ");
if(null != employees) {
aBuffer.append(employees.size());
}
return aBuffer.toString();
}
}
下载 ElementCollection_EnumMap.zip以下是数据库转储。
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
Column Name: DEPARTMENT_ID,
Column Type: INTEGER:
Column Value: 1
Table Name: EMP_PHONE
Row:
Column Name: EMPLOYEE_ID,
Column Type: INTEGER:
Column Value: 1
Column Name: PHONE_NUM,
Column Type: VARCHAR:
Column Value: 1231231231
Column Name: PHONE_TYPE,
Column Type: VARCHAR:
Column Value: Home