Захват информации об объекте в пользовательском прослушивателе сущностей

Я хотел бы, чтобы пользовательский прослушиватель сущностей генерировал автоматически увеличиваемый псевдоним для нескольких сущностей.

Я реализовал один класс util, чтобы сгенерировать автоматически увеличивающийся псевдоним для сущностей в распределенной среде следующим образом:

@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 и соответственно приведение типов, что будет выглядеть не очень хорошо. Любая лучшая идея относительно того, как это сделать?

Другой связанный вопрос в том же контексте: если у меня уже есть объект, имеющий функцию @PrePersist, будет ли функция, определенная в прослушивателе объектов, переопределять это, ИЛИ будут ли они оба работать?


person Joy    schedule 08.05.2021    source источник


Ответы (1)


Слушатели сущностей не могут быть параметризованы. Просто заставьте соответствующие объекты реализовать интерфейс, например. Aliased методом setAlias(). После этого у вас будет один тип для приведения.

Кроме того, зачем использовать Redis? Разве в вашей БД нет последовательностей?

person crizzis    schedule 08.05.2021