我用Hibernate映射了一个Scala类。该类包含一个惰性val,因此Scala会自动创建一个名为bitmap$0
的类属性,不幸的是,该属性也被Hibernate映射。
如何防止Hibernate映射此自动生成的属性?
好的,我找到了解决方案。我设置了一个自定义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
}