执行删除查询时,我发生了一种奇怪的行为。我使用spring mvc 3.1和JPA(hibernate)和oracle DB。 以下是我的applicationcontext的相关部分
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnit"/>
<property name="dataSource" ref="dataSource"/>
</bean>
我创建了一个自定义注释
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(isolation = Isolation.DEFAULT, propagation=Propagation.REQUIRED)
public @interface DefaultServiceTransaction{}
我在服务上使用它来使它们成为事务性的。
@Service
@DefaultServiceTransaction
public class UserServiceImpl implements UserService {
@Autowired UserRepositoryuserRepository;
@DefaultServiceTransaction
public void deleteAllForUser(User user){
userRepository.deleteAllForUser(user);
}}
问题是当我执行这个服务方法时,我得到了异常
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:321)
at org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect.ajc$afterThrowing$org_springframework_orm_jpa_aspectj_JpaExceptionTranslatorAspect$1$18a1ac9(JpaExceptionTranslatorAspect.aj:15)
当我将其用于其他服务(实际上在同一个包中)时,同样的策略对我有用 - 所以我认为问题与配置无关。 我很无能......