[英]@Embeddable class with val in 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而不是使用字段注入。
我想這是Hibernate的限制。 它清楚地說Could not locate setter method for property
。 所以我們應該為他提供制定者。 唯一的方法是將val
更改為var
。 即使我們將@Embeddable
注釋添加到插件配置中, no-arg
插件也無法幫助: noArg { invokeInitializers = true annotation("javax.persistence.Embeddable") }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.