是否有可能*转换*多态Hibernate / JPA实体的类型?

时间:2010-08-06 01:52:23

标签: java hibernate jpa polymorphism

更新:发布后,我发现这是this older question的副本。


我有一个奇怪的业务要求:我的应用程序支持用户以“来宾”开始,然后注册成为“已注册”的用户。

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

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

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

我使用布尔鉴别器列映射了它;没问题:

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

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

现在,我想通过设置

将我的GuestUser转换为RegisteredUser
    guestUser.guest = false;

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

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

2 个答案:

答案 0 :(得分:2)

首选委托继承。无论如何,这是更好的设计,更容易以一种干净利落地处理这种变化的方式进行映射。

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

答案 1 :(得分:0)

您是否尝试更改来宾标记,保存更改,然后使用相同的User.ID从数据库加载新对象?