自动连接到休眠拦截器

时间:2014-01-14 12:57:35

标签: java spring hibernate interceptor

我正在扩展hibernate.EmptyInterceptor,在我的实现中,我希望自动连接到某些服务,但它们返回null。我在类上添加了一个@Component注释。我的代码:

<property name="jpaPropertyMap">
    <map>
        <entry key="javax.persistence.transactionType" value="JTA" />
        <entry key="hibernate.current_session_context_class" value="jta" />
        <entry key="hibernate.transaction.manager_lookup_class"
            value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
        <entry key="hibernate.connection.autocommit" value="false" />
        <entry key="hibernate.ejb.interceptor" value="com.net.filter.AuditInterceptor"/>
    </map>
</property>

和班级:

@SuppressWarnings("serial")
@Component
public class AuditInterceptor extends EmptyInterceptor {

    @Autowired
    private IUserSessionService userSessionService;

2 个答案:

答案 0 :(得分:4)

我知道这可能要晚了两年 - 但我正在寻找同样问题的答案,并认为这对未来的某些人有用。

看看Hibernate代码看起来如果给出类名,Hibernate将实例化拦截器的新实例,但是如果传入bean实例引用,它将使用它。

所以

<bean id="myInterceptor" class="com.net.filter.AuditInterceptor" />

...

<property name="jpaPropertyMap">
    <map>
        <entry key="javax.persistence.transactionType" value="JTA" />
        <entry key="hibernate.current_session_context_class" value="jta" />
        <entry key="hibernate.transaction.manager_lookup_class"
            value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
        <entry key="hibernate.connection.autocommit" value="false" />
        <entry key="hibernate.ejb.interceptor" >
            <ref bean="myInterceptor" />
        </entry>
    </map>
</property>

现在bean myInterceptor是Spring管理的,自动装配将起作用!

答案 1 :(得分:3)

Spring将从不@Autowired目标保留为null(除非null是您正在注入的内容)。那应该告诉你,如果@Autowired字段是null,那么Spring与它无关。

这似乎就是这种情况。通过提供类似

的东西
<entry key="hibernate.ejb.interceptor" value="com.net.filter.AuditInterceptor"/>

我相信你告诉Hibernate自己创建该实例,因此它不会是一个Spring托管bean。

如果你发布剩下的bean定义,因为我不知道你想要注入什么bean,可能有其他选择。