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

首先项目里有好多个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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值