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.a.b.model.User.roles
以前はJavaで問題なく動作していました。
次のように、@ElementCollection
にtargetClass
を追加してみました。
@ElementCollection(targetClass = RoleType::class)
しかし、それはまた別の例外を投げています。
Fail to process type argument in a generic declaration. Member : com.a.b.model.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.a.b.model.User#roles Type: class Sun.reflect.generics.reflectiveObjects.WildcardTypeImpl
注:roles
の修飾子をvar
からval
に変更すると機能しますが、これは変更可能な型にする必要があります。フィールドのmutabilityが休止状態でどのように問題を引き起こしているのか理解できません。
注: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<? extends E>
は、探していたものではなくSet<E>
です。