Java 从基于配置的服务bean切换到基于注释的服务bean时的TransactionProxyFactoryBean

Java 从基于配置的服务bean切换到基于注释的服务bean时的TransactionProxyFactoryBean,java,hibernate,spring,proxy,transactions,Java,Hibernate,Spring,Proxy,Transactions,我读到关于使用 <context:component-scan base-package="tld.mydomain.business"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/> </context:component-scan> 并用@service(“myService”)注释我的

我读到关于使用

  <context:component-scan base-package="tld.mydomain.business">
      <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  </context:component-scan>

并用@service(“myService”)注释我的服务bean,我觉得很好,我会这样做,因为我已经用我的控制器做了。我通常的服务bean配置如下所示

  <bean id="userService" parent="txProxyTemplate">
    <property name="target">
      <bean class="tld.mydomain.business.UserServiceImpl"/>
    </property>
    <property name="proxyInterfaces" value="tld.mydomain.business.UserService"/>
  </bean>

既然我已经生成了它们,那么如何将它们包装到一个Hibernate代理中,比如TransactionProxyFactoryBean?或者还有更好的方法吗

我还没有完全使用@Repository,这是必需的吗

干杯


Nik

使用TransactionProxyFactoryBean在现代Spring应用程序中不受鼓励,尽管它仍然有效。现在的典型方法是使用@Transactional注释类,然后将此元素粘贴到应用程序上下文文件中:

<tx:annotation-driven transaction-manager="txManager"/>

这一策略和其他策略在参考文档中有非常深入的介绍,甚至还有一个关于TransactionProxyFactoryBean的旁注

不需要

一旦在基本包中找到它们,Spring将注册
@Service、@Repository、@Component…


就像@Rob所说的,使用
@Transactional
..
在服务级别处理您的事务。

如果您有两个不同的资源需要在同一事务中,那么您将需要使用JTA。请参阅我对前面问题的回答。您的配置需要如下所示:

<tx:annotation-driven transaction-manager="txManager"/>

<bean id="txManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManagerName" value="appserver/jndi/path" />
</bean>

其中,
appserver/jndi/path
需要替换为应用服务器附带的JTA事务管理器的jndi路径(尽管您也可以使用独立的JTA事务管理器,如JOTM)。中提到的典型路径包括:

  • 针对Resin 2.x、Oracle OC4J(Orion)、JOnAS(JOTM)、BEA WebLogic的“java:comp/UserTransaction”
  • Resin 3.x的“java:comp/TransactionManager”
  • GlassFish的“java:appserver/TransactionManager”
  • 用于Borland企业服务器和Sun应用服务器(Sun ONE 7及更高版本)的“java:pm/TransactionManager”
  • JBoss应用服务器的“java:/TransactionManager”

非常感谢,我读了一本关于Spring 2的书,书中推荐了TransactionProxyFactoryBean,现在我明白了,我应该更仔细地查看文档。不过,下面是一个简短的跟进:这似乎只适用于只有一个事务管理器的场景。一、 不幸的是,有两个,因为我需要使用两个不同的数据库。使用TransactionProxyFactoryBean没有问题。表9.2和9.3似乎不建议我可以,嗯,当我这样做时,我在访问我的服务时会遇到以下异常:org.springframework.beans.factory.BeanNotOfRequiredTypeException:Bean名为'org.springframework.transaction.interceptor.TransactionInterceptor#0'必须是[org.aopalliance.aop.Advice]类型,但实际上是类型[org.springframework.transaction.interceptor.TransactionInterceptor]可能是@Service(“myService”)吗和@Transactional annotations clash?在花了几个小时研究这个bug之后,我决定将这个问题作为一个单独的问题发布,而不是在这个线程中进行后续操作。下面是链接:谢谢你的提示,我已经消除了额外的混乱。你对我为什么会出现上面提到的BeanNothoreRequiredTypeException有什么建议吗?或者如何解决eal有多个事务管理器?我从文档中看到,我可以使用提供不同的建议,但在我看来,这仍然只有一个事务管理器?通常
BeanNotOfRequiredType
当您注入错误类型的bean时,但除非您发布stacktrace,否则我无法进一步说明。您只需要1
PlatformTransactionManager
,除非您有2个diff
DataSource
,否则不需要2个。嗨,工具箱,非常感谢您的输入。我使用TransactionProxyFactoryBean时已经能够解决这个问题,因为不必严格地将它们保留在同一事务中,我还可以有两个,其中一个是只读的。这就是为什么我问到要说什么事务去哪里。将它们合并成一个似乎是最好的主意。但是两者都是JDBC连接,我没有使用JNDI。但是我会在早上(现在是午夜)阅读你的建议。干杯-Nik