更新:发布后,我发现这是 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/