正在自定义实体侦听器中捕获实体信息



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

我实现了一个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()。但在这种情况下,如果else和typecast相应的话,它会太多,这看起来不太好。关于如何做有什么更好的主意吗?

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

实体侦听器不能参数化。只需使用setAlias()方法使相关实体实现一个接口,例如Aliased。然后你将有一个单一的类型来铸造。

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

最新更新