gpt4 book ai didi

java - JPA 2 - 在 JavaSE 中使用 EntityManager - 几个问题

转载 作者:搜寻专家 更新时间:2023-11-01 02:54:39 31 4
gpt4 key购买 nike

我有几个关于在 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 并通过引用传递给每个协作者,以帮助您执行用例。

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帮助您摆脱这种样板代码。

关于java - JPA 2 - 在 JavaSE 中使用 EntityManager - 几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4066048/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com