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:)

¿Fue útil?

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top