首页 > 解决方案 > 如何让 Hibernate 忽略某个名称的属性?

问题描述

我用 Hibernate 映射了一个 Scala 类。该类包含一个惰性值,因此 Scala 会自动创建一个名为的类属性bitmap$0,不幸的是它也被 Hibernate 映射。

如何防止 Hibernate 映射这个自动生成的属性?

标签: scalahibernate

解决方案


好的,我找到了解决方案。我设置了一个MetadataProvider伪造属性@Transient注释的自定义。bitmap$0

设置自定义MetadataProvider

configuration.getReflectionManager.asInstanceOf[JavaReflectionManager].setMetadataProvider(new JavaMetadataProvider {
    override def getAnnotationReader(annotatedElement: AnnotatedElement): AnnotationReader = {
        if (annotatedElement.toString.endsWith("bitmap$0")) {
            new TransientAnnotationReader(annotatedElement)
        } else {
            new JavaAnnotationReader(annotatedElement)
        }
    }
})

涉及班级:

class JavaAnnotationReader(val element: AnnotatedElement) extends AnnotationReader {
    override def getAnnotation[T <: Annotation](annotationType: Class[T]): T = element.getAnnotation(annotationType)

    override def isAnnotationPresent[T <: Annotation](annotationType: Class[T]): Boolean = element.isAnnotationPresent(annotationType)

    override def getAnnotations: Array[Annotation] = element.getAnnotations
}

class TransientAnnotationReader(val element: AnnotatedElement) extends AnnotationReader {
    override def getAnnotation[T <: Annotation](annotationType: Class[T]): T = element.getAnnotation(annotationType)

    override def isAnnotationPresent[T <: Annotation](annotationType: Class[T]): Boolean = annotationType == classOf[Transient]

    override def getAnnotations: Array[Annotation] = element.getAnnotations
}

推荐阅读