【发布时间】:2012-09-15 01:57:04
【问题描述】:
在我的一个项目中,我试图将我的持久性管理从应用程序切换到容器。我正在遵循这些说明:http://docs.oracle.com/javaee/6/tutorial/doc/gkhrg.html
我读过 EntityManager 不是线程安全的,只是想确保我的设置是正确的。我的担心:http://weblogs.java.net/blog/2005/12/19/dont-use-persistencecontext-web-app。
我有一个生成持久性上下文的类。
@Singleton
public class JpaResourceProducer {
//The "pu" unit is defined with transaction-type="JTA"
@Produces
@PersistenceUnit(unitName = "pu")
@Database
EntityManagerFactory databasePersistenceUnit;
@Produces
@PersistenceContext(unitName = "pu")
@Database
EntityManager databaseEntityManager;
/* Alternative
@PersistenceContext(unitName = "pu")
private EntityManager em;
@Produces
@UserDatabase
public EntityManager create() {
return em;
}
public void close(@Disposes @Database EntityManager em) {
em.close();
}
*/
}
然后我有一个注入 DAO 的 jax-rs 资源。
@RequestScoped
@Path("/endpoint")
public class MyResource {
@Inject private Dao dao;
@GET
@Produces({MediaType.APPLICATION_JSON})
public Converter get() {
MyEntity entity = dao.find(1);
Converter converter = new Converter(entity);
return converter;
}
}
最后是DAO,我在其中注入EntityManager。
@Singleton
public class JpaDao<T, K extends Serializable> implements Dao<T, K> {
protected Class<T> entityClass;
@Inject
@Database
EntityManager em;
public JpaDao() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
}
public T find(K id) {
return em.find(entityClass, id);
}
....
}
1.就线程安全和整体性能而言,这是一个好的设置吗?
额外问题:
在JpaResourceProducer 中,我为EntityManager 提供了另一种设置,我在处理时手动关闭了管理器。
2.我的EntityManager 的容器处理是否自动关闭?
Oracle 的示例包括EntityManagerFactory。
3.当我使用 CMP 时,我真的需要 EntityManagerFactory 吗?
【问题讨论】:
标签: java jpa thread-safety