您的位置:首页 > 其它

开心:解决一个osgi里hibernate事务transaction的问题

2010-10-04 22:37 405 查看
首先项目里有好多个bundle,简单的来说,我们分成两类,一类是业务方面的bundle,不同业务的放在不同bundle里;另一类是框架类的,比如hibernate,hibernate存在一个独立的bundle里,启动的时候会把所有Persistent Object读进去,然后发布出一个session factory服务,业务方面的bundle就用这个session factroy做db操作。事务管理使用的AOP在另外一个bundle里,这也算是一个框架bundle。所以来说,任何调用会先在这个AOP的bundle里会创建transaction,然后才调用业务bundle的服务。

session factory

|

---------------------------------

Call Service | |

----------------》AOP bunlde -————service bunlde

可能明白的一眼就看出来了,这是有问题的。

Spring里的hibernate在做事务控制的时候,在AOP里会创建事务管理器,这个事务管理器会被存在TransactionSynchronizationManager类的resources变量里,key就是前面的那个session factory,之后在hibernate template里,会去寻找这个事务管理器,还是用哪个session factory作为key。

如果在没有osgi的时候这是很好的,但是一上osgi就不行了,为什么呢?

原因就是,osgi发布出来的service,在不同bundl里得到的引用是不一样的,甚至来说,每次去试图调用service,得到的引用都是不一样的。这些引用之所以不一样,是因为被osgi包了一层,而且每次实时去包。

所以虽然AOP里创建了事务管理器,但是业务bundle里的session factory和AOP创建事务管理器时的session factory 是不一样的,造成hibernate template找不到东西,所以默认为没有事务了。

解决方法就是发布了一个session factory的factory(绕),每个bundle用这个新service去得到session factory。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐