更新:发布后,我发现这是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
。)
答案 0 :(得分:2)
首选委托继承。无论如何,这是更好的设计,更容易以一种干净利落地处理这种变化的方式进行映射。
不要通过子类型进行区分,而是创建一个角色,当您想要更改可以访问的内容时,可以重新分配该角色。
答案 1 :(得分:0)
您是否尝试更改来宾标记,保存更改,然后使用相同的User.ID从数据库加载新对象?