Hibernate:将子类的实例转换为超类的实例

Wis*_*ree 7 java hibernate jpa

假设我有一个名为User的类和一个类ExtendedUser,它是User的子类.使用hibernate(JPA)注释映射这两个类:

用户:

@Entity
@Table("user-table")
@Inheritance(strategy = InheritanceType.JOINED)
public class User {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

}
Run Code Online (Sandbox Code Playgroud)

ExtendedUser:

@Entity
@Table(name = "extended-user-table")
@PrimaryKeyJoinColumn(name="id")
public class ExtendedUser extends User{

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

}
Run Code Online (Sandbox Code Playgroud)

有时需要将用户提升为ExtendedUser; 类似地,有时需要将ExtendedUser降级为用户.

第一个问题:在hibernate中有没有办法直接执行此操作?

无法找到这样的方式我试图做以下(降级的例子):

  1. 将字段从ExtendedUser实例复制到User的新实例.
  2. 删除ExtendedUser实例
  3. 保存用户实例

但是,这似乎在尝试保存新用户时会自动增加id.所有这一切都是在交易中完成的 - 这可能是原因吗?但是,我不想将它们带到事务之外,因为如果保存失败,则自动回滚将不起作用.

第二个问题(如果第一个问题的答案为否):我如何解决ID自动递增的问题.

提前致谢.

xwo*_*ker 2

我认为这个问题应该在 OOD 上解决,而不是在数据库级别上解决。你所做的是一个很好的快捷方式,只要你不尝试做你想做的事情,它就可以 \xe2\x80\x93 工作。

\n\n

我会将登录凭据删除到他们自己的“登录”类中,并将用户保留原样。无需将用户提升为扩展用户,只需添加登录名即可完成。每个与登录相关的用户都是“扩展用户”。

\n\n

另请参阅:https ://stackoverflow.com/a/3246244/2615437 。

\n