spring - 密封类作为一个实体
问题描述
我正在尝试用 kotlin 密封类解决我的继承问题,并用休眠解决强制问题。
这是我的课程:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
sealed class LegalGuardian(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int? = null
)
@Entity
@DiscriminatorValue(value = "MOTHER")
data class MotherLegalGuardian(
@OneToOne(cascade = [CascadeType.ALL], orphanRemoval = true)
val pesel: Pesel
) : LegalGuardian()
@Entity
@DiscriminatorValue(value = "OTHER")
data class OtherLegalGuardian(
val firstName: String,
val lastName: String,
@OneToOne
val address: Address
) : LegalGuardian()
这是抛出的问题:
引起:org.hibernate.MappingException:无法在 org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123) 在 org.hibernate.persister.internal 获取 org.hibernate.persister.entity.SingleTableEntityPersister 的构造函数.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) 在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:348) 在 org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) 在 org.hibernate .jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ... 省略了 95 个常见帧原因:org.hibernate.InstantiationException:无法实例化测试对象:org.hibernate.engine.internal 的 X.MotherLegalGuardian .UnsavedValueFactory。在 org.hibernate.tuple.PropertyFactory.buildIdentifierAttribute(PropertyFactory.java:61) 在 org.hibernate.tuple 在 org.hibernate.engine.internal.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:68) 实例化(UnsavedValueFactory.java:43) .entity.EntityMetamodel.(EntityMetamodel.java:141) 在 org.hibernate.persister.entity.AbstractEntityPersister.(AbstractEntityPersister.java:517) 在 org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:124) 在 sun .reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance (构造函数.java:423) 在 org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) ... 99 个通用框架被省略 原因:java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法)在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在在X.MotherLegalGuardian.(LegalGuardian.kt) ...省略114个常用帧
解决方案
我不知道休眠是如何工作的。但我想这个问题与密封类文档中的注释有关:
密封类本身是抽象的,不能直接实例化,可以有抽象成员。
密封类不允许有非私有的构造函数(它们的构造函数默认是私有的)。
推荐阅读
- android-studio - 为什么 Android Studio 会为某些类输入完整路径?
- java - Spring Batch 从外部类停止作业执行
- python - Wy 函数 time.time() 不会附加到 pandas 数据帧
- html - 如何使整个 div 成为 mailto 链接?
- graph-databases - 为什么大多数图形数据库不支持双向边?
- google-apps-script - 谷歌表自动递增 ID/主键
- google-cloud-dataflow - 谷歌云数据流:连续 8 次测量 GC 抖动后关闭 JVM
- amazon-dynamodb - 无服务器 dynamodb 启用连续备份
- sharepoint - 从 SharePoint 列表自动生成报告
- python - Pythonic 方法来制作一个可以接受可迭代或任意数量的参数的函数?