在我的一个项目中,我试图将我的持久性管理从应用程序切换到容器。我正在遵循这些说明: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
.
EntityManagerFactory
3.当我使用 CMP 时,我真的需要一个吗?