JPA 2 – 在JavaSE中使用EntityManager – 有几个问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JPA 2 – 在JavaSE中使用EntityManager – 有几个问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2473字,纯文字阅读大概需要4分钟。
内容图文
![JPA 2 – 在JavaSE中使用EntityManager – 有几个问题](/upload/InfoBanner/zyjiaocheng/783/0071abb300a0481596bb0c85ec896547.jpg)
关于在JavaSE环境中使用实体管理器,我有几个问题.
我正在使用存储库模式在数据库上执行我的CRUD操作.将有一个基本存储库类,如下所示:
public class Repository<T> implements IRepository<T> {
private EntityManager em;
private String persistenceUnitName;
public Repository(String persistenceUnitName) {
this.persistenceUnitName = persistenceUnitName;
}
@Override
public T find(Class<T> type, Object id) {
return em.find(type, id);
}
private EntityManager getEntityManager() {
if (this.em == null) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName);
em = emf.createEntityManager();
}
return em;
}
...
...
}
然后我将拥有像EmployeeRepository这样的类来继承Repository.这些存储库类将在我的服务层中创建.
这是初始化实体管理器的好方法吗?我开始认为它不是 – 看起来每个持久性单元应该只有一个实体管理器?在这种情况下,您将为您创建的每个存储库都有一个实体管理器……您将如何确保每个持久性单元只有一个实体管理器?另外,我注意到实体管理器和实体管理器工厂方法有一个close方法 – 何时应该调用它们?在服务器终止事件?
如果你知道在JavaSE中使用JPA的任何好的消息来源我会很感激.
谢谢!
解决方法:
几乎.每个持久性单元只需要一个EntityManagerFactory.
How would you go about ensuring you only have one EntityManagerFactory per persistence unit ?
通常开发人员使用单例EntityManagerFactory创建一个辅助类,例如
public class EntityManagerFactoryHelper {
private static EntityManagerFactory factory;
static {
try {
// Set up factory right here
} catch(ExceptionInInitializerError e) {
throw e;
}
}
public static EntityManagerFactory getFactory() {
return this.factory;
}
}
另一方面,EntityManager用于与称为持久性上下文的一组被管实体实例进行交互.
如果你想知道为什么我使用ErrorInInitializerError,它的API很清楚
Signals that an unexpected exception has occurred in a static initializer
…
Is this a good way of initializing the entity manager ?
嗯,服务层用于分隔事务边界.因此,对于每个用例,您可以创建EntityManager并通过引用传递每个帮助您执行用例所需的colaborator.
public static br.com.helper.EntityManagerFactoryHelper.getFactory;
public EmployeeService {
public void doSomething() {
EntityManager eManager = getFactory().createEntityManager();
eManager.getTransaction().begin();
EmployeeRepository repository = new EmployeeRepository(eManager);
eManager.getTransaction().commit();
}
}
现在假设您需要针对每个用例显示上面显示的样板代码.
public void forEachUseCase() {
// Create an EntityManager
// Begin a Transaction
EmployeeRepository repository = new EmployeeRepository(eManager);
// And finally, commit
}
您可以依靠Spring来帮助您摆脱这个样板代码.
内容总结
以上是互联网集市为您收集整理的JPA 2 – 在JavaSE中使用EntityManager – 有几个问题全部内容,希望文章能够帮你解决JPA 2 – 在JavaSE中使用EntityManager – 有几个问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。