当我在JPA中使用Idclass用于具有复合键的实体时,我编写了一个删除方法,如:
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();
}
}
我没有得到任何错误,但我想知道这是否是正确的方法呢?
答案 0 :(得分:3)
是的,这是正确的方法。 EntityManager.find()
方法需要实体的ID类的实例。不是实体的一些随机属性。
请注意,错误不是由remove()
方法引起的,而是由find()
方法引起的。