Kotlin: Коллекция не имеет ни общего типа, ни OneToMany.targetEntity ()

У меня есть класс Enum RoleType

 public enum RoleType { SYSTEM_ADMIN, PROJECT_ADMIN, USER; } 

В моем классе сущности User меня есть следующее сопоставление для коллекции enum. Это код Java :

 @JsonProperty @ElementCollection @Enumerated(EnumType.STRING) @CollectionTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id")) private Set<RoleType> roles; 

Я преобразовал этот класс сущности User в Kotlin и вот код:

 @JsonProperty @Enumerated(EnumType.STRING) @ElementCollection @CollectionTable(name = "user_role", joinColumns = arrayOf(JoinColumn(name = "user_id"))) var roles: kotlin.collections.Set<RoleType>? = null 

После преобразования hibernate бросает следующее исключение:

 Collection has neither generic type or OneToMany.targetEntity() defined: com.abmodel.User.roles 

Он работал отлично на Java.

Я также попытался добавить targetClass в @ElementCollection следующим образом:

 @ElementCollection(targetClass = RoleType::class) 

но это также бросает другое исключение.

 Fail to process type argument in a generic declaration. Member : com.abmodel.User#roles Type: class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl ERROR [2017-05-27 04:46:33,123] org.hibernate.annotations.common.AssertionFailure: HCANN000002: An assertion failure occurred (this may indicate a bug in Hibernate) ! org.hibernate.annotations.common.AssertionFailure: Fail to process type argument in a generic declaration. Member : com.abmodel.User#roles Type: class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl 

Примечание . Если я изменяю модификатор roles из var в val , он работает, но мне нужно, чтобы это изменяемый тип. Я не понимаю, как изменчивость поля создает проблемы в спящем режиме.

Примечание . Я использую версию Kotlin 1.1.2-2 и Hibernate 5.2.

Вы пытались изменить

 var roles: Set<RoleType>? = null 

в

 var roles: MutableSet<RoleType>? = null 

Если вы посмотрите на определение интерфейса Set , вы увидите, что он определен как public interface Set<out E> : Collection<E> тогда как MutableSet определяется как public interface MutableSet<E> : Set<E>, MutableCollection<E>

Set<out E> эквивалент Java Set<out E> я считаю, что Set<? extends E> Set<? extends E> вместо того, что вы искали Set<E> .