【问题标题】:Capturing entity information in custom entity listener在自定义实体侦听器中捕获实体信息
【发布时间】:2021-05-08 05:43:07
【问题描述】:

我想要一个自定义实体侦听器来为一些实体生成一个自动递增的别名。

我已经实现了一个实用程序类,以便为分布式环境中的实体生成自动递增别名,如下所示:

@Component
public class AutoIncrementingIdGenerationUtil {

  private final RedisTemplate<String, Object> redisTemplate;

  public AutoIncrementingIdGenerationUtil(
      RedisTemplate<String, Object> redisTemplate) {
    this.redisTemplate = redisTemplate;
  }

  public String getNextSequenceNumber(String keyName) {
    RedisAtomicLong counter = new RedisAtomicLong(keyName,
        Objects.requireNonNull(redisTemplate.getConnectionFactory()));
    return counter.incrementAndGet();
  }
}

现在,我的应用程序中有几个实体,对于少数几个实体,我想生成别名。

所以我正在编写自己的自定义实体侦听器,如下所示:

@Component
public class CustomEntityListener<T> {

  private final AutoIncrementingIdGenerationUtil autoIncrementingIdGenerationUtil;


  public CustomEntityListener(
      AutoIncrementingIdGenerationUtil autoIncrementingIdGenerationUtil) {
    this.autoIncrementingIdGenerationUtil = autoIncrementingIdGenerationUtil;
  }

  @PrePersist
  void onPrePersist(Object entity) { <----HERE I WOULD LIKE TO CAST TO CONCRETE ENTITY TYPE, 
    if(StringUtils.isBlank(entity.getAlias())) {
       entity.setAlias(autoIncrementingIdgenerationUtil.getNextSequenceNumber(entity.getEntityType());
  }
}

如上所述,所有实体都没有别名属性。我对如何做到这一点没有任何正确的想法。一个坏主意是使用getTEntityype()。但是在这种情况下,if-else 和相应的 typecast 会太多,看起来不太好。关于如何做到这一点有更好的想法吗?

在同一上下文中的另一个相关问题,如果我的实体已经具有 @PrePersist 函数,实体侦听器中定义的函数是否会覆盖它,或者它们都会运行?

【问题讨论】:

    标签: spring spring-boot hibernate jpa entitylisteners


    【解决方案1】:

    实体侦听器无法参数化。只需让相关实体实现一个接口,例如Aliased,使用 setAlias() 方法。然后,您将拥有一个要转换为的类型。

    另外,为什么要使用 Redis?你的数据库没有序列吗?

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 2015-12-15
      • 2021-09-24
      • 1970-01-01
      相关资源
      最近更新 更多