请问ejb+hibernate的事务控制

首先问问有没有这样一个架构:

struts + ejb + hibernate

如果有的话,那么事务控制是怎样的呢?

因为ejb由两种事务控制类型:Container和Bean

如果采取Bean,那么需要手动编写事务控制代码,这反而容易控制
就是在ejb中需要事务控制的方法中加入hibernate的事务控制语句就可以了。那么事务就会委托给hibernate所配置的事务管理jta或者简单的事务管理。


如果采取Container,那么ejb容器就会对ejb中的方法采取事务控制,而ejb又是调用hibernate,所以问题就是hibernate本身配置的事务还起作用吗?如果hibernate不进行事务控制,而是交给ejb容器来做的话,那在什么时候释放hibernate session?

怎么没有人回答,我自己顶一下

ejb + hibernate也是Hibernate推荐的架构之一啊。

建议采取Container,hibernate的事务当然起作用,如果你的系统对事务要求严格,建议使用CMP,当然牺牲了易开发性。

如果选择Container,那么事务控制就是由容器来实现的。

那么在hibernate中不需要些事务控制代码。

问题:我们在什么时候释放hibernate session?

如果在hibernate层中释放session,那么容器的事务控制就不对。

还是我的看法不对?

再请banq解惑?

可以配置hibernate的事务控制是委托给应用服务器的jta来实现,但是在编写事务控制代码时,必须显示的调用hibernate的beginTransaction()和commit()等等代码,还是不需要调用这些事务控制代码呢?

我不清楚。

拜托去hibernate论坛看看好吗?里面写得很清楚。为什么在这里问?

正巧我今天做了一些相关的测试,你可以看看http://www.blogbus.com/blogbus/blog/diary.php?diaryid=172865

当ejb + hibernate使用CMT的时候,要注意的就是不要编写任何事务相关的代码,其实比自己写事务处理更加简单,而且可以享受“声明式事务”的好处!

flyisland ,在你得提示下,我现在明白了。你看说得对不对:
在hibernate层中利用session进行数据操作,然后关闭session,但是session中引用得数据库connection并没有关闭,所以容器的事务控制还是可以控制事务的。

我原来担心的是,session关闭,那么connection也会关闭,所以容器事务管理不能正确执行。

> flyisland
> ,在你得提示下,我现在明白了。你看说得对不对:
> 在hibernate层中利用session进行数据操作,然后关闭sessio
> ,但是session中引用得数据库connection并没有关闭,所以?> 器的事务控制还是可以控制事务的。

没错,从我的实验来看是这样子的。而且EJB的规范也有类似的代码。

> 我原来担心的是,session关闭,那么connection也会关闭,?> 以容器事务管理不能正确执行。

我今天看了hibernate文档。
如果在jta的情况下使用cache,必须保证session在关闭之前完成事务。

我原来的想法是在hibernate层关闭session,并不影响事务的管理。
但是现在看来它影响了cache的使用。

那么现在应该在什么地方关闭session呢?
在事务完成之前,已经不可能关闭session
事务完成之后,再关闭session,但是session所关联的collection已经被jta事务所关闭了。