Kotlin中的val可插入类

我正在研究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) 

是默认的。 然后它会寻找制定者,而不是使用现场注射。