The following code shows how to use embedded key in one to many mapping.
The following code is from Department.java.
package com.java2s.common; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MapKey; import javax.persistence.OneToMany; @Entity public class Department { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private String name; @OneToMany(mappedBy="department") private Map<EmployeeName, Employee> employeesByName; public Department() { employeesByName = new HashMap<EmployeeName,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 Map<EmployeeName, Employee> getEmployees() { return employeesByName; } public void addEmployee(Employee employee) { EmployeeName empName = new EmployeeName(); empName.setFirst_Name(employee.getFirstName()); empName.setLast_Name(employee.getLastName()); employeesByName.put(empName, employee); if (employee.getDepartment() != null) { employee.getDepartment().removeEmployee(employee); } employee.setDepartment(this); } public void removeEmployee(Employee employee) { Iterator iter = employeesByName.entrySet().iterator(); while (iter.hasNext()) { Employee current = ((Map.Entry<EmployeeName,Employee>) iter.next()).getValue(); if (current.getId() == employee.getId()) { iter.remove(); current.setDepartment(null); } } } 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(employeesByName.size()); return aBuffer.toString(); } }
The following code is from Employee.java.
package com.java2s.common; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; @Entity public class Employee { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; @Column(name="F_NAME") private String firstName; @Column(name="L_NAME") private String lastName; private long salary; @ManyToOne private Department department; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } 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 String toString() { StringBuffer aBuffer = new StringBuffer("Employee "); aBuffer.append(" id: "); aBuffer.append(id); aBuffer.append(" name: "); aBuffer.append(lastName); aBuffer.append(", "); aBuffer.append(firstName); aBuffer.append(" with dept: "); if(null != department) { aBuffer.append(department.getName()); } return aBuffer.toString(); } }
The following code is from PersonDaoImpl.java.
package com.java2s.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.setFirstName("Tom"); Department d = new Department(); d.setName("test"); e.setDepartment(d); EmployeeName name = new EmployeeName(); name.setFirst_Name("Tom"); d.getEmployees().put(name, e); em.persist(e); em.persist(d); } @PersistenceContext private EntityManager em; }
The following code is from EmployeeName.java.
package com.java2s.common; import javax.persistence.Column; import javax.persistence.Embeddable; @Embeddable public class EmployeeName { @Column(name="F_NAME", insertable=false, updatable=false) private String first_Name; @Column(name="L_NAME", insertable=false, updatable=false) private String last_Name; public String getFirst_Name() { return first_Name; } public void setFirst_Name(String firstName) { first_Name = firstName; } public String getLast_Name() { return last_Name; } public void setLast_Name(String lastName) { last_Name = lastName; } }
The following is the database dump.
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: F_NAME, Column Type: VARCHAR: Column Value: Tom Column Name: L_NAME, Column Type: VARCHAR: Column Value: null Column Name: SALARY, Column Type: BIGINT: Column Value: 0 Column Name: DEPARTMENT_ID, Column Type: INTEGER: Column Value: 1