When I use a Idclass in JPA for a entity with a composite key and I write a remove method like :
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();
}
}
I get the error :
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
When I change the code to :
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();
}
}
I don’t get any errors but I wonder if this is the right way to do this?
Yes, it’s the right way to do it. The
EntityManager.find()method expects an instance of the ID class of the entity. Not some random attribute of the entity.Note that the error isn’t caused by the
remove()method, but by thefind()method.