看起来像spring忽略服务类上的@Transactional注释。 我读了一些q&a on SO和blogs,但没有一个选项对我有效。
@Component
和@Transactional
注释。@Inject
注释。proxy-target-class="true"
,但没有效果。当我收到此异常时,错误发生在DAO图层上,注释为@Transactional(propagation = Propagation.MANDATORY)
:
org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'
这是一些代表所涉及的类和接口的通用代码:
public interface IService<T extends BaseEntity> {
void save(T entity);
}
public abstract class AbstractService<T extends BaseEntity> implements IService<T> {
@Inject
private IDao dao;
@Override
public void save(T entity) {
dao.save(entity);
}
}
public interface IPersonService extends IService<PersonEntity> {
void saveAll(List<PersonEntity> persons);
}
@Component
@Transactional
public class PersonService extends AbstractService<PersonEntity> implements IPersonService {
@Override
public void saveAll(List<PersonEntity> persons) {
for (PersonEntity person : persons) {
super.save(person);
}
}
}
@Component
public class PersonApi {
@Inject
private IPersonService personService;
public void saveAll(...) {
...
personService.saveAll(persons);
}
}
有任何想法或建议吗?
答案 0 :(得分:1)
事实证明我还必须使用@Transactional注释抽象类,否则它将无法工作。 Spring文档仅讨论接口。 由于我在这里调用抽象类方法,因此它也需要是@Transactional。
@Transactional
public abstract class AbstractService<T extends BaseEntity> implements IService<T> {
@Inject
private IDao dao;
@Override
public void save(T entity) {
dao.save(entity);
}
}