java - 是否可以*转换*多态 Hibernate/JPA 实体的类型?

标签 java hibernate jpa polymorphism

更新:发布后,我发现这是 this older question 的重复项.

<小时/>

我有一个奇怪的业务需求:我的应用程序支持用户以“访客”身份开始,然后注册成为“注册”用户。

访客的功能受到限制:他们无法访问注册后可用的某些功能。然而,他们确实可以访问功能的子集,并且可能在注册之前开始积累持久数据。其中许多功能将被建模为 User 实体类上的方法,并且累积的数据自然会通过 GuestUser 的 @Id 关联起来。

因此,我正在考虑在 JPA/Hibernate 中将其建模为多态实体类型:

            User
             ^
             |
      +-------------+
      |             |
   GuestUser  RegisteredUser

I've mapped this using a boolean discriminator column; no problem:

@DiscriminatorColumn(name="guest", discriminatorType=DiscriminatorType.INTEGER)

这一切正常,直到 GuestUser 决定“注册”...?!

现在我想通过设置将我的 GuestUser 转换为 RegisteredUser

    guestUser.guest = false;

从逻辑上讲,此转换的结果是清除 GuestUser 对象,然后从继承的 User 映射中获取具有相同 ID 和共享字段的等效 RegisteredUser。

这可能吗?我可以以某种方式使用entityManager.refresh()来达到预期的结果吗?我是否可以创建一个 RegisteredUser 实例并手动将其 ID 分配给现有 GuestUser 的值? (这个 ID 分配的想法似乎有问题,因为我们的旧数据库需要 GenerationType.AUTO。)

最佳答案

优先选择委托(delegate)而不是继承。无论如何,它的设计更好,并且更容易以干净地处理此更改的方式进行映射。

不要按子类型进行区分,而是创建一个角色,当您想要更改他们可以访问的内容时可以重新分配该角色。

关于java - 是否可以*转换*多态 Hibernate/JPA 实体的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3420479/

相关文章:

java - "new"表达式中的花括号? (例如 "new MyClass() { ... }")

java - 使用 hibernate 插入数据库但出现 java.lang.reflect.InitationTargetException 异常

java - 在 Java EE 6 应用程序(数据库/文件系统)中存储大量文件的最佳方式

java - JPQL 不在 ID 列表中

java - JPA 2 : how to declare primary-key columns in @ElementCollection tables

java - UI性能:repeat in JSF2/Mojara

java - 通过 Telegram Bot 将图像发布到 Telegram channel

java - 如何让 Spring @Transactional 回滚所有未捕获的异常?

java - Flux 返回空对象

java - Hibernate 抛出 MultipleBagFetchException - 不能同时获取多个包