gpt4 book ai didi

java - JPA,何时打开和关闭entityManager

转载 作者:行者123 更新时间:2023-12-01 10:53:15 26 4
gpt4 key购买 nike

我已经为 Web 应用程序设置了 Spring MVC 应用程序,并且正在使用 JPA 2.1 的 Hibernates 实现。

我已经创建了模型,并且能够与数据库正常交互。

我还决定使用服务类来管理实体的返回。我所做的是创建一个 BaseService 类,因此所有其他服务类都将在此基础上进行扩展,并且它们将可以访问常见函数,例如 create()、delete()、update() 和 list()。

我的问题是我不确定何时应该创建 EntityManager 以及何时应该关闭它?

目前,在我的 Controller 中,我在 Controller 加载时启动所需的服务;

@Controller
@RequestMapping("/mycontroller")
public class TestController {

CarService carService = new CarService();
ShowroomService showroomService = new ShowroomService();
}
}

这里是各个其他服务扩展的BaseService;

public class Service<Ety> {

EntityManager em = null;
public Class<Ety> entityClass;

public Service(Class<Ety> entityClass) {
this.entityClass = entityClass;

em = JPAUtil.getEntityManager();
}

public Ety get(int id) {
Ety object = null;

em.getTransaction().begin();
object = em.find(entityClass, id);
em.getTransaction().commit();

return object;
}

public List list() {
List<Ety> objects;

em.getTransaction().begin();
objects = em.createQuery("SELECT c FROM "+entityClass.getName()+" c").getResultList();
em.getTransaction().commit();

return objects;
}

public void save(Ety object) {
em.getTransaction().begin();
em.persist(object);
em.getTransaction().commit();
}

public void update(Ety object) {
em.getTransaction().begin();
em.merge(object);
em.getTransaction().commit();
}

public void delete(Ety object) {
em.getTransaction().begin();
em.remove(object);
em.getTransaction().commit();
}

}

这是一个扩展上述服务的示例服务;

public class CarService extends Service<Car> {

public CarService() {
super(Car.class);
}

}

如您所见,我在创建服务时创建了一个 EntityManager,但目前我没有在任何地方关闭它。

我是否在正确的位置创建了实体管理器?我什么时候应该关闭它。

我曾考虑过将实体管理器放入静态属性中并在过滤器中创建它,然后在应用程序结束时将其关闭,但是我确实相信这不是线程安全的并且会导致问题?

如有任何建议,我们将不胜感激。

最佳答案

您的 CarService 应该是一个 spring bean,并且该实例是从 spring 创建的。不是来自你的代码。与 EntityManager 相同。您可以将entityManager 与@autowired 注释一起使用。

关于java - JPA,何时打开和关闭entityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33734692/

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