【发布时间】:2013-01-13 06:33:11
【问题描述】:
我有一个问题,Spring 将 DAO 对象的代理注入到服务中,但是这个服务被注入到控制器中,它是具体的类。这不允许我使用服务范围的事务并分别为每个 DAO 调用启动事务。这是我所期望的。
配置:
Controller 是带有 @Controller 注解和构造函数 DI 的类。
服务:
@零件 @事务 公共类 UserServiceImpl 实现 UserService { ...}道:
@零件 @事务 公共类 UserDaoImpl 实现 UserDao {JPA 配置:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name="dataSource" ref="dataSource"/>
<property name="persistenceUnitName" value="xxxPersistenceUnit"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven />
有人知道为什么会这样吗?
【问题讨论】:
-
我会放弃服务上的“@Compoment”并放置“@Service”原型注释。至于 dao,我会放置“@Repository”注释并放弃 Component 注释。此外,“@Transactional”属性意味着服务的每个方法都将具有相同的事务传播。我会根据它们应该做什么分别注释我的每个方法。
-
我添加了一个答案,所以请检查您的事务配置 xml 文件是否由声明用户服务的同一 app context 处理。随时问更多问题