Kotlin:集合既没有泛型类型,也没有 OneToMany.targetEntity()

2022-09-01 10:28:09

我有一个枚举类RoleType

public enum RoleType {
    SYSTEM_ADMIN, PROJECT_ADMIN, USER;
}

在我的实体类中,我对枚举集合进行了以下映射。这是代码:UserJava

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

我将此实体类转换为,下面是代码:UserKotlin

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

转换后,休眠将引发以下异常:

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

它以前在Java中工作正常。

我也尝试像这样添加进来:targetClass@ElementCollection

@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

注意:如果我将修饰符从更改为,它正在工作,但我需要这是一个可变类型。我不明白字段的可变性是如何在休眠状态中产生问题的。rolesvarval

注意:我使用的是 Kotlin 1.1.2-2 & Hibernate 5.2 版本。


答案 1

你有没有试过改变

var roles: Set<RoleType>? = null

var roles: MutableSet<RoleType>? = null

如果您查看 的接口定义,您将看到它被定义为,而被定义为Setpublic interface Set<out E> : Collection<E>MutableSetpublic interface MutableSet<E> : Set<E>, MutableCollection<E>

Set<out E>的 Java 等效物,我相信它并不是你想要的。Set<? extends E>Set<E>


答案 2