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

标签 java hibernate jpa enums kotlin

我有一个枚举类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/

相关文章:

hibernate - 从 glassfish 4 迁移到 wildfly 8.1 后,AttributeConverter 失败

java - 实现授权代码流程授予类型 OAuth2

java - 索引 1 处的绑定(bind)值为空

java - 使用 java 8 流将字符串替换为 HashMap 值

java - 如何向预制的 Android 程序添加另一个按钮 (Android Studio)

java - Hibernate:java.lang.IllegalArgumentException:无法设置 int 字段

java - Map<String, List> 或 List<List> 的 Hibernate 注释

java - 使用 JPA/ORM 生成数据库模式是个坏主意吗?

java - ¿创建产品功能?在带有外键的 JPA Hibernate Spring-boot 中

java - Spring JPA 多对多持久性问题