更广泛使用的方法是创建
EntityManager每个请求。但是,这应该对您隐藏。你应该使用一些依赖注入机制(春/ CDI /
EJB),将注射合适的
EntityManager地方
@PersistenceContext放置。
如果您对在某些情况下Bean是某种单例(一个无状态Bean /一个作用域单例的spring
bean)的普通情况下如何实现这一点感兴趣,那么容器实际上会在目标对象中注入一个代理。并且每次查询代理时,它都会获取 当前
EntityManager实例,该实例(至少在spring的情况下)绑定到
ThreadLocal(在这种情况下为request)
更新: 如果要在本地框架中实现此功能,请使用cglib / javassist /
JDK代理并将其注入到
@PersistenceContext放置位置。一个请求=线程。在每个需要数据访问的请求上,创建一个新请求
EntityManager并将其存储在中
ThreadLocal。记住最后要清理它,因为servlet容器会重用线程。从代理可以获取当前
ThreadLocal值。
但是,如果您不熟悉该项目,那么我建议您改用更稳定的东西,例如spring,cdi或guice。



