数据库回调如PreUpdate,PreInsert with Spring data jpa和QueryDSL

时间:2018-06-15 06:17:32

标签: hibernate spring-data-jpa querydsl

我们正在使用spring data jpa(春季启动1.5)和queryDSLMysql DB进行互动。我正在尝试**intercept所有数据库调用,如insert和update**来执行加密/解密等操作。 我试图像preUpdate那样实现JPA callbacks,但在使用queryDSL实现数据库查询时,没有一个被调用。 另一方面,当我使用诸如save之类的CrudRepository方法时,JPA回调可以正常工作。

@Entity
@Table(name = "APPLICATION")
public class Application implements Serializable {

    @Id
    @Column(name = "ID", unique = true)
    private Long id;

    @Column(name = "PAN", insertable = false)
    private String pan;

    @PreUpdate
    void preUpdate() throws IOException, HttpException {
        //logic to encrypt before update is called
    }
}

QueryDSL调用

@Autowired
private JPAQueryFactory queryFactory;

@Transactional
@Override
public void updatePanById(String pan, Long id) {
    QApplication application = QApplication.application;
    queryFactory.update(application)
            .set(application.pan, pan)
            .where(loan.id.eq(id))
            .execute();
}

JPA代码

Application application = applicationRepository.findById(id);
application.setPan("ABC");
applicationRepository.save(application);

在我们的应用程序中,我们使用QueryDSL,本机查询和CrudRepository方法,并希望拦截集中位置的所有数据库调用。 这有可能以任何方式实现吗?

1 个答案:

答案 0 :(得分:0)

没有一种适合所有人的解决方案。使用QueryDSL,您将无法获得回调和处理程序的处理程序。 entitylisteners作为执行发生在持久化上下文之外。 jpa回调的第一行说明:

It is often useful for the application to react to certain events that occur inside the **persistence mechanism**

简单的方法是在帮助程序类中编写所需的操作(加密/解密),并将包装器写入JPAQueryFactory,覆盖所需的事件方法以在事件执行之前拦截您的操作。您可以使用回调和/或entitylistener方法调用相同的辅助类。

这同样适用于您的本机SQL DAO,请为其编写包装。