2017-09-30 1 views
0

Ich arbeite an Gradle-Kotlin-Hibernate-Projekt. Ich möchte einige meiner Klassen unveränderlich halten, was in Kotlin besonders einfach ist. Dies funktioniert gut für @Entity@Embeddable Klasse mit val in Kotlin

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

// ID and others 

} 

dank der Verwendung von Kotlin-JPA Plugin. Aber das gleiche Plugin funktioniert nicht für @Embeddable.

@Embeddable 
class MeetingKeychain(
     val immutableProp: String 
) { 

// ID and others 

} 

Die folgende Ausnahme ausgelöst:

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 

Meine Frage ist zunächst, dass es eine Möglichkeit, um dieses? Ich möchte meine @Embeddable Klasse unveränderlich sein.

Antwort

0

Eigentlich erweist sich das als machbar und nicht mit Kotlin verwandt. Der einzige Weg, den es ist, ist, dass Sie Standard-Konstruktor generieren müssen, was für das kotlin-jpa Plugin verwendet wird. Sie müssen

@Access(AccessType.FIELD) 

während

@Access(AccessType.PROPERTY) 

ist die Standardeinstellung verwenden. Dann sucht es nach Settern und nicht nach Feldinjektionen.

Verwandte Themen