jpa 如何从EclipseLink类描述符中获取id值?

gojuced7  于 2023-01-09  发布在  Eclipse
关注(0)|答案(1)|浏览(133)

我们目前有以下正在运行的软删除定制器:

public class SoftDeleteCustomizer implements DescriptorCustomizer {

  @Override
  public void customize(ClassDescriptor descriptor) {
    descriptor.getQueryManager().setDeleteSQLString(
        String.format("UPDATE %s SET record_status = 'D', record_status_time = CURRENT_TIMESTAMP WHERE id = #ID",
                      descriptor.getTableName()
        )
    );
  }

}

现在我们要添加删除记录的用户。我可以清理用户名,但我更喜欢使用参数/实参。
我重写了定制器,没有为#ID设置参数,因为它已经在某个地方被正确地注入了。(带参数?)。所以我必须为#ID添加一个参数,但是我不知道如何获得要从ClassDescriptor中删除的记录/实体的id /主键值。
这是我目前掌握的情况:

@Override
  public void customize(final ClassDescriptor descriptor) {
    final DeleteObjectQuery query = new DeleteObjectQuery();
    query.addArgument("DELETED_BY", String.class);
    query.addArgument("ID", Long.class);
    query.addArgumentValue(SecurityUtils.getUsername());
    query.addArgumentValue(...); // How to get the ID of the record to delete?
    query.setSQLString(String.format(DELETE_SQL, descriptor.getTableName()));
    descriptor.getQueryManager().setDeleteQuery(query);
  }
fjaof16o

fjaof16o1#

好的,作为一种解决方案,我使用了我们的审计监听器,它是作为EntityListeners之一添加的。它实现了SessionCustomizer。在那里我能够做到:

@Override
  public void postDelete(final DescriptorEvent event) {
    final Long id = ((AbstractEntity) event.getObject()).getId();
    // Create and execute update query to set the username
  }

相关问题