JPA标准在Spring Boot应用程序中连续删除而奇怪的例外



我有一个JPA Entity Witch是某种HTTP请求日志,我想创建一个计划的任务,其中删除旧条目也在应用程序启动时旧了。

我可以一个一个删除,但是当我想批量删除较旧的

时,我总是会得到相同的例外(请参见下文)

我用一种方法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();
    }
}

它是正确创建删除查询的,但是当尝试执行Alwasy fals时,无论它是在启动或计划的任务上,还是直接希望通过App Admin界面运行它。

> 。

org.springframework.dao.invaliddataaccessapiusageException:执行 更新/删除查询;嵌套异常是 javax.persistence.transactionRequiredException:执行 更新/删除查询 org.springframework.orm.jpa.entitymanagerfactoryutils.convertjpaaccessexpectifionifpossible(EntityManagerFactoryutils.java:413) 〜[Spring-orm-4.2.7.Release.jar:4.2.7.Release] at org.springframework.orm.jpa.vendor.hibernatejpadialect.translateexceptifionifposclible(hibernatejpadialect.java:227) 〜[Spring-orm-4.2.7.Release.jar:4.2.7.Release]

在我称之为此存储库方法的服务中,用@Transactional巫婆注释,意味着这应该是在交易中。根据我的资源,我还应该与@Transactional一起使用@Modifying注释,但也不适用。

这就是我的服务方法的样子,这就是我发现异常的地方

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

您正在创建自己的EntityManager实例,不知道春季交易的处理。

只是注入实体管理器:

@PersistenceContext
private EntityManager em;

最新更新