MappedSuperclass 产生'has an unbound type and no explicit target entity'



我有这个实体。它应该对内部和外部用户都有效。

@Entity(name = "TokenAuthentication")
class TokenAuthenticationEntity<T>(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null,
...
@NotNull
@ManyToOne(fetch = FetchType.EAGER)
val user: T,
) : BaseEntity()

当我运行这个时,我得到

TokenAuthenticationEntity

属性。用户具有未绑定类型且没有显式目标实体。解决此通用用法问题或设置显式目标属性

所以Hibernate告诉我滚掉我的泛型,它需要显式定义。有人知道如何让泛型运行吗?

这不可能。原因是编译时的T类型擦除。此T类型在编译时用于检查类型并保证类型安全,但随后将其删除。话虽如此,TokenAuthenticationEntity的每个实例可以有不同的T值,并且如前所述,此信息将丢失。

你实际上可以做的是:

@MappedSuperclass
public abstract class TokenAuthenticationEntity<T> {
private T user;
}

现在你可以基于这个泛型超类创建你的实体了:

@Entity
public class InternalUser extends TokenAuthenticationEntity<IUser> { }
@Entity
public class ExternalUser extends TokenAuthenticationEntity<EUser> { }

为什么?因为TokenAuthenticationEntity的每个具体子类都有一个类型T,它被定义并保留,并且在子类中是唯一的。在这种情况下,JPA将根据所选的@InheritanceStrategy将子类存储在一个或多个表中(如果没有指定继承注释,或者没有为实体类层次结构指定继承类型,则使用SINGLE_TABLE映射策略)。更多详细信息请访问https://www.baeldung.com/hibernate-inheritance#single-table.

最新更新