当前位置: 首页 > 知识库问答 >
问题:

DB回调,如PreUpdate、PreInsert with Spring data jpa和QueryDSL

潘弘扬
2023-03-14

我们使用spring data JPA(spring Boot1.5)和QueryDSLMySQL DB进行交互。我正在尝试**intercept所有DB调用,如insert和update**来执行加密/解密等操作。我尝试实现像preupdate这样的JPA回调,但当使用QueryDSL实现DB查询时,没有调用它们。另一方面,当我使用像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();
}
Application application = applicationRepository.findById(id);
application.setPan("ABC");
applicationRepository.save(application);

共有1个答案

苏承载
2023-03-14

没有一种解决办法可以一刀切。使用QueryDSL,由于执行发生在持久性上下文之外,您将不会获得callbacks&entitylisteners的handler。jpa回调的第一行声明:

应用程序对**持久性机制**内发生的某些事件作出反应通常很有用

简单的方法是在helper类中编写所需的操作(加密/解密),并将包装器编写到JPAQueryFactory中,在事件执行之前重写所需的事件方法来截取您的操作。和/或entitylistener方法调用的帮助器类。

这同样适用于本地SQL DAO,编写一个包装器。

 类似资料:
  • 问题内容: 我在StackOverflow上遇到了类似的问题,尝试了解决方案,但没有找到答案。 我正在使用一种相当通用的JPA策略来设置某些实体的上次修改时间。设置列和字段,然后使用标记方法,并将其设置为等于当前时间。 问题是,我可以在调试器中看到正在调用该方法并且该字段正在更新,但是在我的数据库日志中,我仅看到一个SQL调用,以UPDATE更改字段,其中不包含timestamp字段的UPDATE

  • 问题内容: 我正在与Firebase一起学习AngularJS。我真的很努力与Firebase 的回调,并试图更新… 如果我将其取出,则它可以按预期工作,但不会在页面加载时更新DOM。 谢谢! 更新 解决方案1-移除服务上的并将其注入并应用于控制器: 解决方案2-实施“ SafeApply”方法(感谢Alex Vanston): 尽管它们都可以工作并且代码也不多,但我还是觉得它们太笨拙了。是否有某

  • 问题内容: 我已经打了一个拦截器将修复到现有project.the主要问题是,我一定会喜欢使用,并在照顾使用Hibernate实现JPA与会议现场(INSERT和UPDATE)。 原因? :需要进行此更改,因为有必要使用,而且我知道(因为我之前已经遇到过),liquibase使用默认的current_timestamp将时间戳转换为datetime,对于MySQL数据库来说太糟糕了。 所以我需要一

  • 问题内容: 我有以下课程: 我的所有实体类都使用该类。 所以我有以下课程 和 因此,当我创建一个新客户时,出现以下错误: 我在这里做错了。 问题答案: 至少在使用JPA 的API 时,and 回调确实在…中工作,这在您的情况下还不清楚。 您在使用还是API?在后一种情况下,使用注解的方法,从JPA注释将不会被调用(和我的建议是使用监听器或拦截器)。

  • 问题内容: 我已经使用和事件监听器插入创建日期和表更新的日期。 我面临的问题是,当我将实体保存在数据库中的创建日期无法与在更新记录时插入更新日期相同的表中插入时,它也不会插入更新日期。 我的代码示例如下所示: 侦听器类别: hibernate连接类: DAO中的实体保存和更新方法: 我的测试班: 如果我使用的话,它将插入创建和更新的日期,但是每次我调用flush方法时都会执行更新的查询。目前,我评

  • 问题内容: 我已经打了一个拦截器将修复到现有project.the主要问题是,我一定会喜欢使用,并在照顾使用Hibernate实现JPA与会议现场(INSERT和UPDATE)。 原因? :需要进行此更改,因为有必要使用,而且我知道(因为我之前已经面对过),liquibase使用默认的current_timestamp将时间戳转换为日期时间,这对于mysql数据库来说太糟糕了。 所以我需要一种在代