2017-09-30 8 views
0

私はGradle-Kotlin-Hibernateプロジェクトに取り組んでいます。私はKotlinで特に簡単なクラスのいくつかを不変に保ちたいと思います。これはkotlin-JPAプラグインの使用に@EntityKotlinのvalを持つ@Embeddableクラス

@Entity(name = "SOMETHING") 
class MeetingKeychain(
     val immutableProp: String 
) { 

// ID and others 

} 

感謝のためだけで正常に動作します。しかし、同じプラグインはの@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クラスを不変にしたいと思います。

答えて

0

実際、これは実行可能であることが証明されており、Kotlinとは関係ありません。関連する唯一の方法は、デフォルトのコンストラクタを生成する必要があるということです。このコンストラクタは、kotlin-jpaプラグインが使用されています。あなたは

@Access(AccessType.PROPERTY) 

がデフォルトです

@Access(AccessType.FIELD) 

ながら使用する必要があります。その後、フィールド注入を使用せずにセッターを探します。

関連する問題