1

複合キーを持つエンティティにJPAでIdclassを使用し、次のようなremoveメソッドを記述した場合:

private static void removeEmployee(Employee employee) {
    EntityManagerFactory emf = Persistence
            .createEntityManagerFactory("JPA_excer_3b");
    EntityManager em = emf.createEntityManager();
    try {
        em.getTransaction().begin();
        Employee anemployee = em.find(Employee.class, employee.getId());
        em.remove(anemployee);
        em.getTransaction().commit();
    } catch (Exception e) {
        logging.error("This error is added a removing a employee :"
                + " :" + e);
    } finally {
        // Close all the connections:
        em.close();
        emf.close();
    }
}

エラーが発生します:

ERROR Logger:22 - This error is added a removing a employee :java.lang.IllegalArgumentException: Provided id of the wrong type for class be.leerstad.JPA.entities.Employee. Expected: class be.leerstad.JPA.entities.EmployeePK, got class java.lang.Integer

コードを次のように変更すると:

private static void removeEmployee(Employee employee) {
    EntityManagerFactory emf = Persistence
            .createEntityManagerFactory("JPA_excer_3b");
    EntityManager em = emf.createEntityManager();
    try {
        **EmployeePK pk = new EmployeePK(employee.getId(),employee.getEmail());**
        em.getTransaction().begin();
        Employee anemployee = em.find(Employee.class, **pk**);
        em.remove(anemployee);
        em.getTransaction().commit();
    } catch (Exception e) {
        logging.error("This error is added a removing a employee :"
                + " :" + e);
    } finally {
        // Close all the connections:
        em.close();
        emf.close();
    }
}

エラーは発生しませんが、これが正しい方法かどうか疑問に思います。

4

1 に答える 1

3

はい、それはそれを行う正しい方法です。このEntityManager.find()メソッドは、エンティティのIDクラスのインスタンスを想定しています。エンティティのランダムな属性ではありません。

エラーの原因はremove()メソッドではなく、メソッドであることに注意してくださいfind()

于 2012-12-16T14:25:00.140 に答える