在Spring启动应用程序中,JPA标准删除连续出现异常异常

时间:2016-12-15 09:52:00

标签: java spring hibernate jpa

我有一个jpa实体女巫是某种http请求日志,我想创建一个计划任务,其中delet旧条目也在应用程序启动时更老。

我可以删除一个,但是当我想批量删除旧版本时,我总是得到相同的例外(见下文)

我使用一种方法void cleanLog();

创建了一个自定义存储库
    public class RequestLogRepositoryImpl implements RequestLogRepositoryCustom {

    private final LogWrapper log = new LogWrapper(this.getClass());

    @Autowired
    @Qualifier(value = "someQualifier")
    private LocalContainerEntityManagerFactoryBean emf;

    @Autowired
    private CleanUpProperties cleanUpProperties;

    private EntityManager em;
    private CriteriaBuilder cb;

    @PostConstruct
    private void postBusinessEventRepositoryCustomImpl() {
        this.em = emf.getNativeEntityManagerFactory().createEntityManager();
        this.cb = em.getCriteriaBuilder();
    }

    @Override
    public void cleanLog() {
        Calendar calendar = Calendar.getInstance();
        calendar.add(cleanUpProperties.getField().getValue(), -(cleanUpProperties.getLength()));

        log.info("Delete before :" + calendar.getTime());

        CriteriaDelete<RequestLogEntity> delete = cb.createCriteriaDelete(RequestLogEntity.class);
        Root<RequestLogEntity> root = delete.from(RequestLogEntity.class);

        delete.where(cb.lessThanOrEqualTo(root.get("requestTime"), calendar.getTime()));

        em.createQuery(delete).executeUpdate();
    }
}

它正确地创建了删除查询,但是当尝试执行它时,无论是启动时还是计划任务,或者直接想通过应用程序管理界面运行它,都会有相同的异常。

  

org.springframework.dao.InvalidDataAccessApiUsageException:正在执行   更新/删除查询;嵌套异常是   javax.persistence.TransactionRequiredException:执行   更新/删除查询   org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:413)   〜[spring-orm-4.2.7.RELEASE.jar:4.2.7.RELEASE] at   org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:227)   〜[弹簧ORM-4.2.7.RELEASE.jar:4.2.7.RELEASE]

在我调用此存储库方法的服务中使用@Transactional注释,这意味着这应该在事务中。根据我的资源,我也应该使用@Modifying注释和@Transactional,但也不能使用它。

这就是我的服务方法的样子,这是我捕获异常的地方

@Override
@Modifying
@Transactional
public boolean clearLog() {
    try{
        requestLogRepository.cleanLog();
    }catch (Exception e){
        log.fatal("Error:", e);
        return false;
    }
    return true;
}

1 个答案:

答案 0 :(得分:2)

您正在创建自己的EntityManager实例,而不知道Spring事务处理。

注入实体经理:

@PersistenceContext
private EntityManager em;