我有一个基于 JPA (Hibernate), Spring 和 CXF 的Web服务应用程序。 我在事务性业务方法之后面临一些延迟加载异常(因为我需要在rpesentation层中呈现一些额外的bean),我想尝试一下OpenSession / EntityManagerInView 模式。 / p>
请不要争论这个选择,我们只是试一试。
问题是,由于我使用的是 CXFServlet ,而不是标准的Spring Servlet,我不能在web.xml中使用 OpenEntityManagerInViewFilter 。
我不能使用 OpenEntityManagerInViewInterceptor ,它适用于WebRequest拦截器(并且不适用于CXF拦截器/过滤器)。
最后我知道HibernateInterceptor,一个将任何方法包装到会话中的AOP代理。但仍然是:这个是针对Hibernate API而不是JPA API(我使用的是 EntityManagerFactory ,而不是 SessionFactory )。
那么,您是否知道:
提前感谢您的帮助。
答案 0 :(得分:0)
再次,我终于找到了我想要的东西...... 实际上有一个JpaInterceptor可以做我想要的(虽然它似乎已被弃用了。我真的不明白为什么)。
以下是生成的配置,其工作方式类似于魅力,并且按名称使用了一些自动代理:
<bean id="jpaInterceptor" class="org.springframework.orm.jpa.JpaInterceptor">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="jpaAutoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
<property name="beanNames">
<list>
<value>myService1</value>
<value>myService2</value>
<value>...</value>
</list>
</property>
<property name="interceptorNames">
<list><value>jpaInterceptor</value></list>
</property>
</bean>
<jaxrs:server id="services" address="/">
<jaxrs:serviceBeans>
<ref bean="myService1" />
<ref bean="myService2" />
<ref bean="..." />
</jaxrs:serviceBeans>
</jaxrs:server>