I noted the persist() on the EntityManager does perform always perfom a storing of the object, already before the method has been completed. Even an if an ApplicationException(marked as rollback) is thrown, the object will be stored. Isn't there any method to mark an object only, as it will be stored only on commit?
I ran through this type of problem...But the problem was caused by the database i was using
( SQL without innodb support). So my database was not supporting transactions. I hope it's not the case with you too.