Does remove(Object entity) method of EntityManager work only on those objects got from find() method?
I have following code snippet:
Yes in case of merge or remove operation you have to use a find() operation and then use the remove method on the retrieved entity.
Quoting from ObjectDB's manual on deleting JPA entity objects:
In order to delete an object from the database it has to first be retrieved (no matter which way) and then in an active transaction, it can be deleted using the remove method.
An IllegalArgumentException is thrown by remove if the argument is not a an instance of an entity class or if it is a detached entity.
When creating object with new
operator, it becomes a detached entity, you need to persist it if you want to remove it.
When retrieving entity, you are retrieving persistent entity.
Something to that direction. EntityManager.remove works only for managed entities. How you obtained these managed entities does not matter, it can be for example:
But simply creating new object and trying to remove it does not work, because this new object is not managed entity. Also entity should not be yet detached.
Life of entity is quite much as follows, all in same transaction (entities outside their transaction are not managed):
Entity ent = new Entity(1); //entity is in new state, EntityManager never know
//anything about it
em.persist(ent); //entity is managed as long as not disconnected
//from EntityManager
em.clear(); // all previously managed entities, including ent, are now detached
Entity same = em.find(1); //managed same
em.remove(same); // entity is removed
With JPA
, you can remove an entity without retrieving it by simply executing a delete
statement:
javax.persistence.Query query = entityManager.createQuery("delete from A where id = :id");
query.setParameter("id", "value of id to delete");
int deletedRows = query.executeUpdate();