首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为实体的密封类

作为实体的密封类
EN

Stack Overflow用户
提问于 2019-09-11 16:53:26
回答 2查看 2.4K关注 0票数 4

我试图用kotlin密封类和hibernate来解决我的继承问题。

以下是我的课程:

代码语言:javascript
复制
@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()

下面是抛出的poroblem:

由: org.hibernate.MappingException:无法为org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:348) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:获得构造函数879) . 95种常见帧被忽略,原因是:无法实例化测试对象: org.hibernate.engine.internal.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:43) at org.hibernate.engine.internal.UnsavedValueFactory.getUnsavedIdentifierValue(UnsavedValueFactory.java:68) at org.hibernate.tuple.PropertyFactory.buildIdentifierAttribute(PropertyFactory.java:61) at org.hibernate.tuple.entity.EntityMetamodel.(EntityMetamodel.java:141) at org.hibernate.persister.entity.AbstractEntityPersister.(( org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:124) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法)在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) . 99种常见帧被省略::sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法中的java.lang.reflect.InvocationTargetException: null )在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.hibernate.engine.internal.UnsavedValueFactory.instantiate(UnsavedValueFactory.java:40) .由: java.lang.NoSuchMethodError: X.LegalGuardian.(Lkotlin/jvm/internal/DefaultConstructorMarker;引起的109个常见帧省略)V at X.MotherLegalGuardian.(LegalGuardian.kt) .省略114个通用帧

EN

回答 2

Stack Overflow用户

发布于 2019-09-11 17:10:02

我不知道hibernate是怎么工作的。但我想这个问题与密封类文档的笔记有关

密封类本身是抽象的,不能直接实例化,并且可以具有抽象成员。 密封类不允许有非私有构造函数(默认情况下它们的构造函数是私有的)。

票数 0
EN

Stack Overflow用户

发布于 2019-09-11 19:40:19

看起来问题不在密封类中,而是在数据类和构造函数中。当您使用带参数的主构造函数时,不存在默认(非参数)构造函数,这是hibernate所必需的。您可以在堆栈跟踪的末尾看到原因:

X.LegalGuardian.(Lkotlin/jvm/internal/DefaultConstructorMarker;)V at X.MotherLegalGuardian.(LegalGuardian.kt)

您可以启用诺阿格jpa-支持插件来生成no构造函数。

还可以查看这篇文章,它解释了为什么数据类不是hibernate的好选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57893680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档