![]() |
1
5
我可以创建一个JDK代理:
您可以从自定义SessionFactoryBean调用它:
需要在中注册资源.groovy要替换标准Grails ConfigurableLocalSessionFactoryBean:
|
![]() |
2
2
我已经解决了这个问题(至少在Hibernate为这样的事情提供合适的API之前)。解决方案的简短版本:
较长版本: http://www.developer-b.com/blog/entry/1635/2010/oct/07/intercepting-hibernate-sessions 来源/Github: http://github.com/multi-tenant/grails-hibernate-hijacker
|
![]() |
3
2
伯特和金布尔的答案都会奏效,但你可以更容易地做到这一点。您确实需要创建一个实现Hibernate CurrentSessionContext类的类,但是不需要为会话工厂创建代理,因为您可以重写会话上下文类中的会话创建行为,然后只需在会话工厂bean的属性中指定该类的名称。e、 g.像这样编写会话上下文
然后在传递给会话工厂类的属性中,指定以下类名:
例如,在典型的Spring场景中,可以使用Spring工厂bean来实例化hibernate属性,如下所示:
然后通常使用Spring会话工厂bean创建会话工厂,例如(注意,对于不同版本的Hibernate,包名会有所不同):
Hibernate包含三个不同的会话上下文类,因此只需重写与您相关的会话上下文类:
这三种方法都有buildOrObtainSession方法,该方法的javadoc实际上表示“为子类化目的而提供”。如果您正在使用跨多个资源的事务(如多个数据库或数据库和JMS队列),则需要JTA会话上下文;如果您只是在每个事务中访问单个资源,则ThreadLocalSessionContext就足够了。 |
![]() |
4
1
看一看这个 Hibernate-filter plugin 我也相信 Multi-tenant plugin |
![]() |
5
1
在代码中只有一个从hibernate请求新会话的地方(例如在DAOs的抽象基类中),并在那里启用过滤器可能是最干净的。 |