`

Spring hibernate测试session 自我忽悠

阅读更多
日志http://japi.iteye.com/blog/264033中写了spring测试时hibernate的session问题..

使用AbstractTransactionalDataSourceSpringContextTests类..
对于session的缓存问题.
对于查询的问题已经解决.
但更新与删除,在今天的测试中,发现没有提交数据库.

有人提出使用
this.transactionManager.commit(this.transactionStatus); 

提交事务,但是这样就出现了脏数据的问题.

很是郁闷,为什么查询可以,插入可以,但就是更新与删除不可以呢..

在http://www.iteye.com/topic/70008?page=1里,有人问到两个session是不是同一个...LZ问题是肯定的,但我这儿怎么就问题得不到解决,于是自己测试下..

public void update(T t) {
		// TODO Auto-generated method stub
		System.out.println("s22"+getHibernateTemplate().getSessionFactory().getCurrentSession());
		getHibernateTemplate().update(t);
		System.out.println("s2"+getHibernateTemplate().getSessionFactory().getCurrentSession());
	}

输入session.
在测试类中也
protected void flushSession() {
SessionFactory sessionFactory = ((SessionFactory)applicationContext.getBean("sessionFactory"));
System.out.println("s1---"+sessionFactory.getCurrentSession());

sessionFactory.getCurrentSession().clear();
sessionFactory.getCurrentSession().flush();



System.out.println("s11---"+sessionFactory.getCurrentSession());


}
也输出..

s1---SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])
s11---SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])
Hibernate: select article0_.id as id5_1_, article0_.cid as cid5_1_, article0_.title as title5_1_, article0_.content as content5_1_, article0_.hot as hot5_1_, article0_.author as author5_1_, article0_.loadtime as loadtime5_1_, article0_.srcfrom as srcfrom5_1_, article0_.staticHtml as staticHtml5_1_, article0_.displayTop as displayTop5_1_, columnmode1_.id as id10_0_, columnmode1_.name as name10_0_, columnmode1_.description as descript3_10_0_, columnmode1_.rightFlag as rightFlag10_0_, columnmode1_.leftFlag as leftFlag10_0_, columnmode1_.treeLevel as treeLevel10_0_ from a_article article0_ left outer join j_column columnmode1_ on article0_.cid=columnmode1_.id where article0_.id=?

s22SessionImpl(PersistenceContext[entityKeys=[EntityKey[cn.allobject.db.Article#543], EntityKey[org.java1995.model.ColumnModel#2], EntityKey[org.java1995.model.ColumnModel#1]],collectionKeys=[CollectionKey[org.java1995.model.ColumnModel.Articles#2], CollectionKey[org.java1995.model.ColumnModel.Articles#1], CollectionKey[cn.allobject.db.Article.AAttachments#543], CollectionKey[cn.allobject.db.Article.reviews#543]]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])

s2SessionImpl(PersistenceContext[entityKeys=[EntityKey[cn.allobject.db.Article#543], EntityKey[org.java1995.model.ColumnModel#2], EntityKey[org.java1995.model.ColumnModel#1]],collectionKeys=[CollectionKey[org.java1995.model.ColumnModel.Articles#2], CollectionKey[org.java1995.model.ColumnModel.Articles#1], CollectionKey[cn.allobject.db.Article.AAttachments#543], CollectionKey[cn.allobject.db.Article.reviews#543]]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])


发现了,两处的session是不一样的.
一处是session里没有实体.一处的里面有实体..
感觉那个LZ是不是弄错了,但后面的跟帖又没有人提出,而且LZ一直说问题已经解决..

再仔细比照下代码
protected void flushSession() {
		SessionFactory sessionFactory = ((SessionFactory)applicationContext.getBean("sessionFactory"));
		System.out.println("s1---"+sessionFactory.getCurrentSession());
		sessionFactory.getCurrentSession().clear();
		sessionFactory.getCurrentSession().flush();
		System.out.println("s11---"+sessionFactory.getCurrentSession());
	}


啾..在flush之前写了一个clear方法..
也就是把session中的实体清空了...所以flush也就没有实质的作用了..

把clear注释,或者放到flush的后面,测试成功...
在控制台也看到了生成的update delete sql语句...

问题解决..
分享到:
评论
1 楼 jinkingmanager 2010-06-21  
先flush再clear,固定模式了……

相关推荐

Global site tag (gtag.js) - Google Analytics