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