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

时间:2013-11-18 09:55:50

标签: 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;

}

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;

}

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

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

无法找到这样的方法我尝试执行以下操作(降级示例):

  1. 将字段从ExtendedUser实例复制到User的新实例。
  2. 删除ExtendedUser实例
  3. 保存用户实例
  4. 但是,在尝试保存新用户时,这似乎会自动增加id。所有这一切都是在交易中完成的 - 这可能是原因吗?但是,我不想将它们带到事务之外,因为如果保存失败,则自动回滚将不起作用。

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

    提前致谢。

1 个答案:

答案 0 :(得分:2)

我认为问题应该在OOD上解决,而不是在数据库级别上解决。你所做的是一个很好的快捷方式 - 只要你不尝试做你想做的事情。

我会将登录凭据删除到他们自己的“登录”类中,并保持用户不变。不要将User提升为ExtendedUser,只需添加一个Login即可完成。与Login有关系的每个用户都是“ExtendedUser”。

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