Spring 作为实体的密封类
我试图用kotlin密封类解决继承问题,用hibernate解决强制问题 以下是我的课程:Spring 作为实体的密封类,spring,hibernate,jpa,kotlin,spring-data-jpa,Spring,Hibernate,Jpa,Kotlin,Spring Data Jpa,我试图用kotlin密封类解决继承问题,用hibernate解决强制问题 以下是我的课程: @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING) sealed class LegalGuardian( @Id @GeneratedValue(stra
@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.entity.SingleTableEntityPersister的构造函数
位于org.hibernate.persister.internal.persisterfactorympl.createEntityPersister(persisterfactorympl.java:123)
位于org.hibernate.persister.internal.persisterfactorympl.createEntityPersister(persisterfactorympl.java:77)
位于org.hibernate.internal.sessionfactorympl。(sessionfactorympl.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:无法实例化测试对象:X.MotherLegalGuardian
位于org.hibernate.engine.internal.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.SingleTableEntityTyperSister。(singleTableEntityTyperSister.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)
位于org.hibernate.persister.internal.persisterfactorympl.createEntityPersister(persisterfactorympl.java:96)
... 省略99个公共帧
原因:java.lang.reflect.InvocationTargetException:null
位于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)
位于org.hibernate.engine.internal.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:40)
... 109省略了公共帧
原因:java.lang.NoSuchMethodError:X.LegalGuardian.(Lkotlin/jvm/internal/DefaultConstructorMarker;)V
在X.MotherLegalGuardian.(LegalGuardian.kt)
... 114省略了公共帧
我不知道hibernate是怎么工作的。 但我猜问题与以下注释有关: 密封类本身是抽象的,不能实例化 直接,可以有抽象成员 密封类不允许有非私有构造函数(它们的 构造函数是私有的(默认情况下)
看起来问题不在密封类中,而是在数据类和构造函数中。当您使用带参数的主构造函数时,没有hibernate所需的默认(无参数)构造函数。您可以在stacktrace的末尾看到原因: java.lang.NoSuchMethodError:X.LegalGuardian.(Lkotlin/jvm/internal/DefaultConstructorMarker;)V位于X.MotherLegalGuardian.(LegalGuardian.kt) 您可以启用和插件以不生成arg构造函数
另请查看这篇文章,它解释了为什么数据类不是hibernate的好选择 那个么你们会将抽象类和公共构造函数一起使用吗?对不起,伙计,正如我说的,我对此一无所知。我已经删除了dataclass,但并没有起到任何作用。同样的错误,即使不使用数据类,您也需要启用上面提到的插件以不生成arg构造函数,因为您的类没有args构造函数。编辑了答案以使其更清楚。