【发布时间】:2018-06-15 06:17:32
【问题描述】:
我们使用spring data jpa(spring boot 1.5)和queryDSL与Mysql DB进行交互。我正在尝试 **intercept 所有数据库调用,如 insert 和 update** 来执行一些操作,如加密/解密。
我尝试像preUpdate 一样实现JPA callbacks,但是当使用queryDSL 实现数据库查询时,它们都没有被调用。
另一方面,当我使用像保存这样的 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
}
}
查询DSL调用
@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 方法,并希望在集中位置拦截所有数据库调用。 这可以以任何方式实现吗?
【问题讨论】:
-
问题在于,QueryDSL 正在调用 EntityManager.executeUpdate,并且此方法绕过了持久性上下文以及 EntityListeners。如果要拦截对数据库的所有调用,则必须实现自己的 JDBC 包装器。
标签: hibernate spring-data-jpa querydsl