I suspect that you are running your code outside a transaction so your
delete operations occur in a separate persistence context and the
find actually returns a detached instance (so JPA is right and you ARE deleting a detached object).
Wrap your find / delete sequence inside a transaction.
Update: Below an excerpt of the chapter 7.3.1. Transaction Persistence Context:
If you use an
EntityManagerwith a transaction persistence context model outside of an active transaction, each method invocation creates a new persistence context, performs the method action, and ends the persistence context. For example, consider using the
EntityManager.findmethod outside of a transaction. The
EntityManagerwill create a temporary persistence context, perform the find operation, end the persistence context, and return the detached result object to you. A second call with the same id will return a second detached object.