作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个枚举类RoleType
public enum RoleType {
SYSTEM_ADMIN, PROJECT_ADMIN, USER;
}
在我的 User
实体类中,我有以下枚举集合的映射。这是 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
,它可以工作,但我需要这是一个可变类型。我不明白字段的可变性是如何在 hibernate 中产生问题的。
注意:我使用的是 Kotlin 1.1.2-2 和 Hibernate 5.2 版本。
最佳答案
你有没有尝试过改变
var roles: Set<RoleType>? = null
到
var roles: MutableSet<RoleType>? = null
如果你看一下 Set
的接口(interface)定义, 你会看到它被定义为 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>
.
关于java - Kotlin:集合既没有泛型类型也没有 OneToMany.targetEntity(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44213074/
我是一名优秀的程序员,十分优秀!