私の例では、永続化するエンティティが 2 つあります。しかし、 @MapKeyColumn アノテーションを使用しようとすると、このアノテーションの使用方法とデータの永続化方法について混乱します。これは、「PRO JPA2本」で説明されている例です。このコードを実行しようとすると、例外が生成されます。
2 つのエンティティ:
@Entity
@Access(AccessType.FIELD)
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private String salary;
@Enumerated(EnumType.STRING)
private EmployeeType type;
@ManyToOne
@JoinColumn(name="dept_id")
private Department deparment;
と
@Entity
public class Department {
@Id
@Column(name="dept_id")
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String Name;
@OneToMany(mappedBy="deparment")
@MapKeyColumn(name="cabin_id")
private Map<String , Employee> empCabin;
......................................
public Map<String, Employee> getEmpCabin() {
return empCabin;
}
public void assignEmpToCabin(Employee emp , String cabinNo) {
System.out.println(emp+" "+cabinNo);
getEmpCabin().put(cabinNo, emp);
if(emp.getDeparment() != null){
emp.getDeparment().removeEmpFromDept(emp);
}
emp.setDeparment(this);
}
public void removeEmpFromDept(Employee emp) {
Iterator<Map.Entry<String, Employee>> entrySet = getEmpCabin().entrySet().iterator();
if(entrySet.hasNext()){
Employee current = ((Map.Entry<String, Employee>) entrySet.next()).getValue();
if(current.getId() == emp.getId()){
System.out.println("dept remove");
entrySet.remove();
current.setDeparment(null);
}
}
}
私のサービスクラス関数
public class EmployeeService {
private EntityManager em;
.............
public void setEmpCabin(Employee emp , Department dept , String cab_id) {
dept.assignEmpToCabin(emp, cab_id);
}
私のメインコード:
tr.begin();
Department dept = deps.createDepartment("Sci");
Employee emp = es.createEmployee("Harmeet Singh", "500" , "5684", dept);
es.setEmpCabin(emp, dept, "10");
tr.commit();
setEmpCabin(...) 関数を使用してデータを挿入しようとすると、例外が生成されます
Caused by: org.hibernate.exception.GenericJDBCException: Field 'cabin_id' doesn't have a default value