我们正在使用spring data jpa
(春季启动1.5)和queryDSL
与Mysql 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方法,并希望拦截集中位置的所有数据库调用。 这有可能以任何方式实现吗?
答案 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,请为其编写包装。