在我的項目中,我使用Hibernate和編程事務劃分。 每次在我的服務方法我寫一些類似的東西。Spring中的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();
當我試圖讓交易法以外的用戶的電子郵件,因爲我懶初始化異常,電子郵件是我的情況是簡單的字符串。 Hibernate甚至不執行sql查詢,直到我調用POJO上的任何getter。
1)我在這裏做錯了什麼?
2)這種方法是否有效?
3)你可以推薦任何opensource項目,這些項目在spring/hibernate上使用基於註釋的配置嗎?
更新
出於某種原因,如果我更換的getCurrentSession與的openSession這個代碼工作正常。有人可以解釋嗎?
謝謝
是不同表中的用戶的電子郵件地址? – 2011-02-27 19:10:01
同一表中的簡單字符串 – user12384512 2011-02-27 19:11:44