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

标签 java hibernate jpa

我已经为 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/

相关文章:

java - 将对象从对象 A 添加到对象 B 而不创建新对象? hibernate

java - 如何使用持久层对好友系统进行建模?

sql - 类似 QueryDSL 的 SimplePath 操作

Java简单应用程序复杂性

java - 为什么我们需要在 hibernate 状态下刷新?

java - 如何在lwjgl中绑定(bind)缓冲区

mysql - 没有时间戳的 HQL 中的日期比较

hibernate - Spring boot + Hibernate - 用户未映射

java - Tomcat 的高 CPU 使用率

java - 不幸的是停止了谷歌地图布局