En mi proyecto utilizo Hibernate con la demarcación de transacciones programáticas. Cada vez que en mis métodos de servicio escribo algo similar a esto.Configuraciones del administrador de transacciones de Hibernate en Spring
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
.. perform operation here
session.getTransaction().commit();
Ahora voy a refactorizar mi código con gestión declarativa de transacciones. Lo que tengo ahora ...
<context:component-scan base-package="package.*"/>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="mySessionFactory"/>
</property>
</bean>
clase de servicio:
@Service
public class TransactionalService {
@Autowired
private SessionFactory factory;
@Transactional
public User performSimpleOperation() {
return (User)factory.getCurrentSession().load(User.class, 1L);
}
}
y simple prueba -
@Test
public void useDeclarativeDem() {
FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext("spring-config.xml");
TransactionalService b = (TransactionalService)ctx.getBean("transactionalService");
User op = b.performSimpleOperation();
op.getEmail();
Cuando trato de obtener el correo electrónico del usuario fuera del método transaccional, tengo Lazy excepción de inicialización, el correo electrónico es mi caso es una cadena simple. Hibernate ni siquiera realiza la consulta sql, hasta que llamo a cualquier getter en mi POJO.
1) ¿Qué estoy haciendo mal aquí?
2) ¿Es este enfoque válido?
3) ¿Puede sugerir algún proyecto de opensources que funcione en spring/hibernate con la configuración basada en anotaciones?
actualización
Por alguna razón si reemplazo getCurrentSession con openSession este código funciona bien. ¿Alguien puede explicarlo por favor?
Gracias
¿El correo electrónico de un usuario está en otra tabla? –
cadena simple en la misma tabla – user12384512