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”
BeanNotOfRequiredType
当您注入错误类型的bean时,但除非您发布stacktrace,否则我无法进一步说明。您只需要1PlatformTransactionManager
,除非您有2个diffDataSource
,否则不需要2个。嗨,工具箱,非常感谢您的输入。我使用TransactionProxyFactoryBean时已经能够解决这个问题,因为不必严格地将它们保留在同一事务中,我还可以有两个,其中一个是只读的。这就是为什么我问到要说什么事务去哪里。将它们合并成一个似乎是最好的主意。但是两者都是JDBC连接,我没有使用JNDI。但是我会在早上(现在是午夜)阅读你的建议。干杯-Nik