【发布时间】:2015-01-11 06:01:16
【问题描述】:
我有一个纯 JAVA 项目,我在 Eclipse 中使用 maven 开发该项目。它具有使用 JPA 和 EclipseLink 的持久性功能,可将数据保存到 Apache Derby。该项目在单元测试和独立的 java 应用程序中完美运行,我直接从我的代码中实例化 EntityManagerFactory:
public class JPAUtil
{
private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("unit-name");
private static Map<Long, EntityManager> ems = new HashMap<Long, EntityManager>();
private JPAUtil(){}
/**
* Get an entity manager
*/
public static EntityManager em(Long id)
{
EntityManager result = null;
if (ems.containsKey(id))
{
result = ems.get(id);
if(!result.isOpen())
{
result = createEntityManager();
ems.put(id, result);
}
}
else
{
result = createEntityManager();
ems.put(id, result);
}
return result;
}
private static EntityManager createEntityManager()
{
EntityManager result =
// factory.createEntityManager(SynchronizationType.SYNCHRONIZED);
factory.createEntityManager();
return result;
}
}
现在,当我将它添加到 GWT 项目中时,我遇到了一些非常难以调试/解决的问题。
问题一:
如果我使用上面的 JPAUtil 类来实例化 EntityManagers 以用于每个 RPC 请求,它就可以工作。但是,如果 GWT 客户端开始向服务器端发出多个请求,而服务器端又试图从 JPA 层提取数据,则读取时会发生多个神秘的 ConcurrencyException(有或没有延迟加载 - 似乎没有区别) .
当我不使用上述类时,我尝试使用以下行将 EntityManager“注入”到 GWT ServiceImpls(servlet)中,尝试访问数据层时会发生 NullPointerException 崩溃:
@PersistenceContext(unitName = "unit-name")
transient protected EntityManager em;
我显然在想,这将是从 GWT 访问持久层的更合适的方式。但是,我在访问 EntityManager 时得到 NullPointerExceptions,因此 GWT 的开发 Jetty 服务器无法自行注入 EntityManager。我处理这类问题的能力似乎有限,我的 Google-FU 似乎也很无奈。所以提出一个具体的问题:
在后端使用 JPA 创建快速、稳定的 GWT 应用程序的最佳方法是什么?
提前谢谢你, el.nicko
【问题讨论】:
标签: java jpa gwt eclipselink