我们需要支持Vaadin 7及其JPAContainer
(旧版内容,而不是-.-)。我们也放弃了Thorntail,转而使用Spring Boot(急需的更改)。
所以我一直在阅读JPAContainer文档,发现的一个有趣之处是它有一个Using JPAContainer with Hibernate部分,他们在其中编写
Hibernate的一个问题是它是为短暂的会话而设计的,但是实体管理器的生存期通常大约是用户会话的生存期。问题是,如果会话或实体管理器中发生错误,则该管理器将变得无法使用。这会导致会话长期存在大问题。
和
推荐的解决方案是使用EntityManager-per-Request模式。强烈建议始终在使用休眠模式时使用该功能。
为此,他们定义了
public class LazyHibernateEntityManagerProvider implements EntityManagerProvider {
private static ThreadLocal<EntityManager> entityManagerThreadLocal = new ThreadLocal<EntityManager>();
... non-static getter, static setter ...
}
然后将它们用于Servlet过滤器(或某些重写的方法中,但它们只列出servlet代码,所以这就是我要复制的内容):
public class LazyHibernateServletFilter implements Filter {
private EntityManagerFactory entityManagerFactory;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
entityManagerFactory = Persistence.createEntityManagerFactory("lazyhibernate");
}
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain
) throws IOException, ServletException {
try {
// Create and set the entity manager
LazyHibernateEntityManagerProvider.setCurrentEntityManager(entityManagerFactory.createEntityManager());
// Handle the request
filterChain.doFilter(servletRequest, servletResponse);
} finally {
// Reset the entity manager
LazyHibernateEntityManagerProvider.setCurrentEntityManager(null);
}
}
@Override
public void destroy() {
entityManagerFactory = null;
}
}
到目前为止,到目前为止,我还只是在弄不清楚谁在管理什么。而且,如果不绕过Spring事务管理器(我不要绕过它),我可以做或不能做的事情。
那么正确的举动是什么?
我可以复制吗
entityManagerFactory = Persistence.createEntityManagerFactory("lazyhibernate")
?
我需要注入工厂吗?
整个事情是否过时了,因为Spring还是在幕后进行了吗? (似乎无法找到任何有关此的信息,因此我假设这不是。)
还有其他事情吗? (提供EntityManager bean的配置类吗?)