Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 作为实体的密封类_Spring_Hibernate_Jpa_Kotlin_Spring Data Jpa - Fatal编程技术网

Spring 作为实体的密封类

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

我试图用kotlin密封类解决继承问题,用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()
下面是抛出的问题:

原因: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构造函数。编辑了答案以使其更清楚。