java - Kotlin 中带有 val 的 @Embeddable 类

标签 java hibernate kotlin

我正在开发 Gradle-Kotlin-Hibernate 项目。我想保持我的一些类不可变,这在 Kotlin 中特别容易。这对于 @Entity

来说效果很好
@Entity(name = "SOMETHING")
class MeetingKeychain(
        val immutableProp: String
) {

// ID and others

}

感谢使用 kotlin-jpa 插件。但同一个插件不适用于@Embeddable

@Embeddable
class MeetingKeychain(
        val immutableProp: String
) {

// ID and others

}

抛出以下异常:

Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.component.PojoComponentTuplizer]
    at org.hibernate.tuple.component.ComponentTuplizerFactory.constructTuplizer(ComponentTuplizerFactory.java:98)
    at org.hibernate.tuple.component.ComponentTuplizerFactory.constructDefaultTuplizer(ComponentTuplizerFactory.java:119)
    at org.hibernate.tuple.component.ComponentMetamodel.<init>(ComponentMetamodel.java:64)
    at org.hibernate.mapping.Component.getType(Component.java:169)
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:398)
    at org.hibernate.mapping.Property.isValid(Property.java:225)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:595)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:265)
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:443)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
    ... 46 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at 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.tuple.component.ComponentTuplizerFactory.constructTuplizer(ComponentTuplizerFactory.java:95)
    ... 56 more
Caused by: org.hibernate.PropertyNotFoundException: Could not locate setter method for property [com.scherule.calendaring.domain.entities.ParticipantId#id]
    at org.hibernate.internal.util.ReflectHelper.findSetterMethod(ReflectHelper.java:540)
    at org.hibernate.property.access.internal.PropertyAccessBasicImpl.<init>(PropertyAccessBasicImpl.java:44)
    at org.hibernate.property.access.internal.PropertyAccessStrategyBasicImpl.buildPropertyAccess(PropertyAccessStrategyBasicImpl.java:27)
    at org.hibernate.mapping.Property.getGetter(Property.java:299)
    at org.hibernate.tuple.component.PojoComponentTuplizer.buildGetter(PojoComponentTuplizer.java:143)
    at org.hibernate.tuple.component.AbstractComponentTuplizer.<init>(AbstractComponentTuplizer.java:46)
    at org.hibernate.tuple.component.PojoComponentTuplizer.<init>(PojoComponentTuplizer.java:42)
    ... 61 more

我的问题是有什么办法可以解决这个问题吗?我希望我的 @Embeddable 类是不可变的。

最佳答案

实际上这被证明是可行的,并且与 Kotlin 无关。唯一相关的方式是您需要生成默认构造函数,kotlin-jpa 插件的用途。您需要使用

@Access(AccessType.FIELD)

同时

@Access(AccessType.PROPERTY)

是默认值。然后它会查找 setter 而不是使用字段注入(inject)。

关于java - Kotlin 中带有 val 的 @Embeddable 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46500195/

相关文章:

android - Kotlin和Retrofit:如何处理HTTP 400响应?

java - HSQLDB:在应用程序 jar 文件中嵌入文本表

java - 从布局中的所有编辑文本中获取文本 - Android 编程

java - 设置ClassLoader的开销

java - 在 Java 中实现 Comparable

java - Spring & hibernate 配置(使用 Maven): java. lang.ClassNotFoundException : org. hibernate.cfg.Configuration

hibernate - 如何使用org.hibernate.tool.EnversSchemaGenerator生成Envers数据库架构?

android - 为什么 Android 存在特定于 Kotlin 的依赖项

java - 我收到 SQLGrammarException

java - 如何从底页导航到 Activity