精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-11
一个测试方法一个transaction,assertEquals这里session还没有关闭,所以你测试不会通过。
|
|
返回顶楼 | |
发表时间:2007-04-11
dada 写道 一个测试方法一个transaction,assertEquals这里session还没有关闭,所以你测试不会通过。
这样说就能够解释了,我一直以为session在dao.delete()方法结束后就关闭了。哈哈 |
|
返回顶楼 | |
发表时间:2007-04-11
总结下, 应该commit transaction才会触发session 的flush的吧。
刚才看了下AbstractTransactionalDataSourceSpringContextTests这个类。他是在onSetup的时候开始transaction 然后在onTeardown时commit transaction。 所以如果不显示调用session.flush的话,table里面是不会有变化的。所以我的设想应该是正确的,flushCurrentSession()方法里面拿的是同一个session。 想要看到数据变化的话 在你的测试方法里面调用下flushCurrentSession()方法就行。。 protected SessionFactory getSessionFactory(){ return (SessionFactory) getApplicationContext().getBean("sessionFactory"); } protected void flushCurrentSession(){ Session session = SessionFactoryUtils.getSession(getSessionFactory(), false); if (session !=null){ session.flush(); } } |
|
返回顶楼 | |
发表时间:2007-04-11
AbstractTransactionalDataSourceSpringContextTests里面的tearDown有两个方法:onTearDownInTransaction和onTearDownAfterTransaction
所以你可以试着把flush的操作放在onTearDownInTransaction里面看看,这样你不用每次都要在测试方法里面调用了! 完了把测试结果贴一下,呵呵。 |
|
返回顶楼 | |
发表时间:2007-04-11
dengyin2000 写道 总结下, 应该commit transaction才会触发session 的flush的吧。
刚才看了下AbstractTransactionalDataSourceSpringContextTests这个类。他是在onSetup的时候开始transaction 然后在onTeardown时commit transaction。 所以如果不显示调用session.flush的话,table里面是不会有变化的。所以我的设想应该是正确的,flushCurrentSession()方法里面拿的是同一个session。 想要看到数据变化的话 在你的测试方法里面调用下flushCurrentSession()方法就行。。 protected SessionFactory getSessionFactory(){ return (SessionFactory) getApplicationContext().getBean("sessionFactory"); } protected void flushCurrentSession(){ Session session = SessionFactoryUtils.getSession(getSessionFactory(), false); if (session !=null){ session.flush(); } } 我觉得改变测试方法比较好: public void testDelete() { service.delete(new Long(1)); Object obj = service.get(new Long(1)); assertNull(obj); } |
|
返回顶楼 | |
发表时间:2007-04-11
dada 写道 dengyin2000 写道 总结下, 应该commit transaction才会触发session 的flush的吧。
刚才看了下AbstractTransactionalDataSourceSpringContextTests这个类。他是在onSetup的时候开始transaction 然后在onTeardown时commit transaction。 所以如果不显示调用session.flush的话,table里面是不会有变化的。所以我的设想应该是正确的,flushCurrentSession()方法里面拿的是同一个session。 想要看到数据变化的话 在你的测试方法里面调用下flushCurrentSession()方法就行。。 protected SessionFactory getSessionFactory(){ return (SessionFactory) getApplicationContext().getBean("sessionFactory"); } protected void flushCurrentSession(){ Session session = SessionFactoryUtils.getSession(getSessionFactory(), false); if (session !=null){ session.flush(); } } 我觉得改变测试方法比较好: public void testDelete() { service.delete(new Long(1)); Object obj = service.get(new Long(1)); assertNull(obj); } 我有遇到你这种情况, 一个同事使用jdbc去验证的时候 会有问题, 但是我用service去拿的话 就能通过。 最后发现我这里发送了update语句,而用jdbc去验证的话并没有flush。 我不觉得你上面的方式好。 因为我这种方式对于使用jdbc或者其他方式去验证都是有效的, 而且如果我没有get find方法呢? 我还要为测试去加多这样的方法? |
|
返回顶楼 | |
发表时间:2007-04-11
tsingn 写道 Godlikeme 写道 每次调用,应该是取的不同的session,这样是不对的,参见HibernateTemaplate.executeWithSession 同意!
但是不知道为什么用不同的session flush一下也会起作用? flush后session是与数据库同步的,因为测试不是多线程,session之间就不会出现不一致的情况。 |
|
返回顶楼 | |
发表时间:2007-04-11
Godlikeme 写道 每次调用,应该是取的不同的session,这样是不对的,参见HibernateTemaplate.executeWithSession
这个问题我看错了,原来问题是jdbctemplate.execute(),不是不同session的问题。 只能显示调用sessionFlush了,hibernateTemplate和jdbcTemplate一块用,这样不一致性的问题就会一直存在。 |
|
返回顶楼 | |
发表时间:2007-04-11
Godlikeme 写道 Godlikeme 写道 每次调用,应该是取的不同的session,这样是不对的,参见HibernateTemaplate.executeWithSession
这个问题我看错了,原来问题是jdbctemplate.execute(),不是不同session的问题。 只能显示调用sessionFlush了,hibernateTemplate和jdbcTemplate一块用,这样不一致性的问题就会一直存在。 是的 我没有发现,hibernateTemplate有executeWithSession这个方法。 正规的话 当然是应该用jdbc来测试的。 |
|
返回顶楼 | |
发表时间:2007-04-11
dada 写道 dengyin2000 写道 总结下, 应该commit transaction才会触发session 的flush的吧。
刚才看了下AbstractTransactionalDataSourceSpringContextTests这个类。他是在onSetup的时候开始transaction 然后在onTeardown时commit transaction。 所以如果不显示调用session.flush的话,table里面是不会有变化的。所以我的设想应该是正确的,flushCurrentSession()方法里面拿的是同一个session。 想要看到数据变化的话 在你的测试方法里面调用下flushCurrentSession()方法就行。。 protected SessionFactory getSessionFactory(){ return (SessionFactory) getApplicationContext().getBean("sessionFactory"); } protected void flushCurrentSession(){ Session session = SessionFactoryUtils.getSession(getSessionFactory(), false); if (session !=null){ session.flush(); } } 我觉得改变测试方法比较好: public void testDelete() { service.delete(new Long(1)); Object obj = service.get(new Long(1)); assertNull(obj); } 刚刚又想到了你这样会不会有问题。看下面的代码,我把delete变成了save public void testSave() { service.save(new Long(1)); Object obj = service.get(new Long(1)); assertNull(obj); } 因为在testSave中是在一个session中, 所以service.get的话可能根本不会读数据库里面的值, 而是拿的session cache中的? |
|
返回顶楼 | |