java - Hibernate:将子类的实例转换为父类(super class)的实例

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

}

扩展用户:

@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 降级为 User。

第一个问题:hibernate 中有没有什么方法可以直接执行此操作?

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

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

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

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

提前致谢。

最佳答案

我认为这个问题应该在 OOD 上解决,而不是在 DB 级别上解决。你所做的是一个很好的捷径——只要你不尝试做你想做的事情。

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

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

关于java - Hibernate:将子类的实例转换为父类(super class)的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20044805/

相关文章:

java - 在 JVM 上设置默认参数

java - 如何在Hibernate中模拟 "ON UPDATE NO ACTION"

java - 有什么方法可以使用 REGEXP 将 sql 查询转换为 hql 查询

java - Spring Boot - 使用自定义对象数组 JSON 序列化自定义对象

java - 在时区将 ZonedDateTime 转换为 LocalDateTime

java - GroovyClassLoader - 与父类加载器隔离

java - 将数字添加到数组中

java - 嵌入式类和双向关系

java - JPA 删除所有不适用于 Google 应用引擎的内容

hibernate - JPA 是否支持数据库中没有外键约束的实体之间的 @OneToMany 映射?