作为实体的密封类

MrN*_*ful 5 spring hibernate jpa spring-data-jpa kotlin

我正在尝试解决 kot​​lin 密封类的继承问题和 hibernate 的强制问题。

这是我的课程:

@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()
Run Code Online (Sandbox Code Playgroud)

这是抛出的问题:

原因:org.hibernate.MappingException:无法在 org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123) 处获取 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.instantiate(UnsavedValueFactory.java:43) 在 org.hibernate.engine.internal.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:68) 在 org.hibernate.tuple.PropertyFactory.buildIdentifierAttribute(PropertyFactory.java:61) 在 org. hibernate.tuple.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(本机方法)在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)在java.lang.reflect。 Constructor.newInstance(Constructor.java:423) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) ... 99 个公共帧被省略 原因:java.lang.reflect.InvocableTargetException: null at sun .reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance (Constructor.java:423) at org.hibernate.engine.internal.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:40) ... 109 个常见帧被省略 原因:java.lang.NoSuchMethodError: X.LegalGuardian.(Lkotlin/jvm /internal/DefaultConstructorMarker;)V at X.MotherLegalGuardian.(LegalGuardian.kt) ... 省略 114 个常见帧

Far*_*tab 0

我不知道休眠是如何工作的。但我想这个问题与密封类文档中的注释有关:

密封类本身是抽象的,它不能直接实例化,并且可以具有抽象成员。

密封类不允许有非私有构造函数(它们的构造函数默认是私有的)。