transacciones Spring y Hibernate: inicialización perezosa
-
10-10-2019 - |
Pregunta
Por lo que he leído hasta ahora tenía el entendimiento de que el uso de transacciones sería la solución para hibernar de problemas de carga diferida. La sesión estaría disponible durante toda la transacción en la capa de servicio sin más adue.
Así que tal vez mal configurado mi gestión de transacciones? En realidad soy un newb cuando se trata de la primavera y de hibernación, pero tal vez ustedes me podría ayudar.
Mi configuración:
<bean class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
id="sessionFactory">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- Hibernate Template bean that will be assigned to DAOs. -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!--
Transaction manager for a single Hibernate SessionFactory (alternative
to JTA)
-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
Mi aplicación DAO simplemente tendría una anotación @Repository
y un grano Hibernate-template
inyectaron usando autowiring.
Un encabezado típico de una implementación de servicio sería:
@Service
@Transactional(readOnly=true)
public class LeerlingServiceImpl implements LeerlingService {
@Autowired
LeerlingDAO leerlingDAO;
@Autowired
LeerplanDAO leerplanDAO;
Con una anotación @Service(readOnly=false)
si algo se graba / modificada en ese método en particular.
¿Es necesario que configure algo más para asegurarse de que puedo cargar las asociaciones correctas en mi servicio, o esto es que normalmente maneja transacciones?
En este momento estoy un poco confundido de lo que realmente debería hacer, así que por favor me ayude:)
Solución
problemas y transacciones perezoso de carga no están muy relacionadas entre sí. Pero eso es otra historia :) Usted ha hecho todo bien, aparte del acceso a la sesión en sus granos. No estoy seguro de cómo se va a hacer esto. La solución estándar (en 2.x primavera, no está seguro acerca 3.x, no han visto todavía) es utilizar HibernateDaoSupport como clase base para las clases eran usted va a tener un acceso a la sesión. Pero personalmente que se parece un poco cutre para mí, porque agrega la dependencia de las clases de primavera-específicos. Mucho mejor es inyectar sesión en sus granos. Para ello, tiene que declarar su bean de sesión con la definición similar a uno:
<bean name="hibernateSession" class="org.springframework.orm.hibernate3.SessionFactoryUtils" factory-method="getSession"
scope="prototype">
<constructor-arg index="0" ref="hibernateSessionFactory"/>
<constructor-arg index="1" value="false"/>
<aop:scoped-proxy/>
</bean>
y luego simplemente utilizarlo.
Aquí están los detalles:
http: //stas-blogspot.blogspot. com / 2009/10 / hibernación-primavera-en-standalone.html
Otros consejos
Creo que mi comprensión de la primavera fue mala hasta ahora; no había hecho ninguna gestión real para nuestra gestión de sesiones. Básicamente lo que ahora ocurrió fue:. Podría obtener datos de la DAO, pero justo después de que lo recibió ni siquiera se podía conseguir colecciones cargado ligeramente porque la sesión se cerró
Ahora estamos utilizando el interceptor de hibernación, que se conecta a la sesión del hilo al comienzo de cada solicitud y la cierra cuando termina. Esto no siempre es la solución más ideal, pero para un proyecto de la escuela no me molesta demasiado.
La otra solución parece ser: añadir AOP de una manera que se utiliza @around
que la sesión sólo está disponible durante una llamada de método de servicio. Creo que esta es la mejor solución, sin embargo, no voy a cavar profundamente que en este momento para este proyecto. Lo bueno es que sé que existe.
En este artículo también me ha ayudado mucho: http://www.jroller.com/kbaum/ entrada / orm_lazy_initialization_with_dao
Para los interesados: esto es lo que he tenido que añadir:. En Spring MVC 3.0 hay una nueva característica llamada mvc:intereceptors
lo que me hizo tipo menos xml
<!-- WEB-INF/applicationContext.xml or your own XML config file -->
<mvc:interceptors>
<bean
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
</mvc:interceptors>