2017-09-30 2 views
0

나는 Gradle-Kotlin-Hibernate 프로젝트 작업을하고있다. 나는 Kotlin에서 특히 쉬운 수업의 일부를 불변으로하고 싶습니다. 이 코 틀린-JPA 플러그인의 사용에 @Entity에 대한Kotlin의 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) 

동안 사용해야합니다. 그런 다음 필드 주입을 사용하지 않고 설정자를 찾습니다.

관련 문제