В своем проекте я использую Hibernate с программным разграничением транзакций. Каждый раз в своих методах службы я пишу что-то подобное.
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
.. perform operation here
session.getTransaction().commit();
Теперь я собираюсь реорганизовать свой код с помощью декларативного управления транзакциями. Что я получил сейчас...
<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>
Класс обслуживания:
@Service
public class TransactionalService {
@Autowired
private SessionFactory factory;
@Transactional
public User performSimpleOperation() {
return (User)factory.getCurrentSession().load(User.class, 1L);
}
}
И простой тест -
@Test
public void useDeclarativeDem() {
FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext("spring-config.xml");
TransactionalService b = (TransactionalService)ctx.getBean("transactionalService");
User op = b.performSimpleOperation();
op.getEmail();
Когда я пытаюсь получить электронную почту пользователя за пределами метода Transactional, я получаю исключение ленивой инициализации, электронная почта в моем случае представляет собой простую строку. Hibernate даже не выполняет sql-запрос, пока я не вызову какие-либо геттеры на своем POJO.
что я делаю неправильно здесь?
Правомерен ли этот подход?
Можете ли вы предложить какой-либо проект с открытым исходным кодом, который работает с Spring/Hibernate с конфигурацией на основе аннотаций?
Обновить
По какой-то причине, если я заменю getCurrentSession на openSession, этот код будет работать нормально. Может кто-нибудь объяснить это, пожалуйста?