实体监听器未调用

我具有以下实体和关联的侦听器

@Entity
@EntityListeners(InjuryListener::class)
class Injury(val description: String,@Id @GeneratedValue(strategy = GenerationType.SEQUENCE) val id: Long = 0)

@Singleton
class InjuryListener : PreDeleteEventListener {
    @PreRemove
    fun preRemove(injury: Injury) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onPreDelete(event: PreDeleteEvent?): Boolean {
        val injury = event?.entity as Injury
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}

但是,当我删除I​​njury时,InjuryListener上的两个方法均未调用。为何有任何线索?

wxm821016 回答:实体监听器未调用

只要您处于微型世界中,大多数“魔术”都是在编译时完成的。关于微导航数据的一个主要陈述是,不存在运行时元模型。

这实际上意味着您的实体上没有DateTime startDateTime = DateTime.UtcNow.Date; //UTC Date DateTime endDateTime = DateTime.UtcNow.Date.AddDays(1).AddTicks(-1); //UTC Date added 1 day 注释。

在微型世界中,您应该使用EntityListener来实现所需的功能。

,

如Ilya Dyoshin所写,@EntityListener@PreRemove未在Micronaut Data中使用。但是您可以通过AOP技术解决它。

首先,使用所需的预删除逻辑创建自己的拦截器:

@Singleton
class InjuryPreDeleteInterceptor : MethodInterceptor<Injury,Boolean> {
    override fun intercept(context: MethodInvocationContext<Injury,Boolean>): Boolean {
        val injury = context.parameterValues[0] as Injury
        if (injury.someFlag) {
            // do not delete
        } else {
            // delete
            context.proceed()
        }
        return true
    }
}

然后创建将触发InjuryPreDeleteInterceptor的注释:

@MustBeDocumented
@Retention(RUNTIME)
@Target(AnnotationTarget.FUNCTION)
@Around
@Type(InjuryPreDeleteInterceptor::class)
annotation class VisitInjuryDelete

并将由先前创建的delete()注释注释的@VisitInjuryDelete方法签名添加到InjuryRepository界面中:

@VisitInjuryDelete
override fun delete(Injury entity)

您可以在https://docs.micronaut.io/latest/guide/aop.html

中找到有关Micronaut的AOP的更多信息。
本文链接:https://www.f2er.com/2999566.html

大家都在问