EntityManager

http://d.hatena.ne.jp/koichik/20060122#1137951021

そうですか、JPA的にEntityManagerってsingletonじゃ駄目かもしれないんですね。なんとなくOKだと思ってしまっていました。

EntityManagerがスレッドセーフかどうかに直接言及しているわけではないですが、関係ありそうな文章がProposed Final Draftのp.127にあります。

When operating with a third-party persistence provider, the container uses the EntityManagerFactory/EntityManager contract defined here to create and destroy persistence contexts. It is undefined whether a new entity manager instance is created for every persistence context, or whether entity manager instances are sometimes reused. Exactly how the container maintains the association between persistence context and JTA transaction is not defined. The container may maintain this association internally, or it may delegate this concern to the persistence provider by using getEntityManager() to obtain the provider's current entity manager.

persistence contextごとに新規のentity managerのインスタンスが必要なのか、entity managerのインスタンスが再利用(共有も含む?)されるのかは仕様で決まってないらしいです。ということなので、singletonを使った場合は前者の実装に対応できないですね。
実装を気にしないでJTAに関連付いたEntityManagerを使うにはEntityManagerFactoryクラスのgetEntityManager()メソッドを利用するしかなさそうな感じです。