0

私の例では、永続化するエンティティが 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
4

0 に答える 0