使用Spring

时间:2019-05-06 10:19:02

标签: java spring hibernate spring-boot entitymanager

我们需要支持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的配置类吗?)

0 个答案:

没有答案