我試圖做與@Transactional
春季交易沒有任何成功。從我的applicationContext.xml@Transactional不能與春天和冬眠
摘錄:
<context:annotation-config />
<context:component-scan base-package="hibex" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="org.postgresql.Driver" p:url="jdbc:postgresql://localhost:5432/hibex"
p:username="clubspace" p:password="clubspace" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/hibernate.cfg.xml" />
<property name="entityInterceptor" ref="beanValidationEventListener" />
</bean>
<!-- a PlatformTransactionManager is still required -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- org.springframework.transaction.jta.JtaTransactionManager
org.springframework.jdbc.datasource.DataSourceTransactionManager -->
<property name="dataSource" ref="dataSource" />
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven />
<aop:aspectj-autoproxy />
我充滿春天配置文件是here。
而且我的方法,如果交易不工作:
@Transactional
public void m2() {
OwnerBO owner2 = ownerManager.get(owner.getId());
owner2.getPets().add(new PetBO("Ubul"));
}
這會導致:
1375 [main] ERROR org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role: hibex.bo.OwnerBO.pets, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: hibex.bo.OwnerBO.pets, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)
at org.hibernate.collection.PersistentSet.add(PersistentSet.java:212)
at hibex.code.Service.m2(Service.java:52)
at hibex.code.App.run(App.java:15)
at hibex.code.Main.main(Main.java:14)
Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: hibex.bo.OwnerBO.pets, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)
at org.hibernate.collection.PersistentSet.add(PersistentSet.java:212)
at hibex.code.Service.m2(Service.java:52)
at hibex.code.App.run(App.java:15)
at hibex.code.Main.main(Main.java:14)
的服務是從這個類叫做:
@Component
public class App {
@Autowired
private Service service;
public void setService(Service service) {
this.service = service;
}
public void run() {
service.m2();
}
}
任何想法?
GenericManager是在這裏:GenericManager on Pastebin
get方法:
public T get(PK id) {
return dao.findById(id);
}
而且GenericDaoImpl#findById(PK)
public E findById(PK id) {
return getHibernateTemplate().get(getEntityClass(), id);
}
感謝
更新日誌:只是增加了額外的相關信息(必需的代碼段)
你能告訴我OwnerManager.get()的代碼(我懷疑這是在你的通用模板中)。問題與交易沒有太大的關係,但事實上Hibernate Session會在你不想要的時候關閉 – 2010-03-01 11:02:52
我修改後顯示get() – pihentagy 2010-03-01 12:45:04