假设我有一个名为 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 中有没有什么方法可以直接执行此操作?
无法找到这样的方法,我尝试执行以下操作(降级示例):
- 将字段从 ExtendedUser 实例复制到 User 的新实例。
- 删除扩展用户实例
- 保存用户实例
但是,这似乎会在尝试保存新用户时自动增加 id。所有这些都是在交易中完成的——这可能是原因吗?但是,我不想将它们带出事务,因为如果保存失败,自动回滚将不起作用。
第二个问题(如果第一个问题的答案是否定的):如何解决ID自动递增的问题。
提前致谢。
最佳答案
我认为这个问题应该在 OOD 上解决,而不是在 DB 级别上解决。你所做的是一个很好的捷径——只要你不尝试做你想做的事情。
我会将登录凭据删除到他们自己的“登录”类中,并让用户保持原样。无需将用户提升为 ExtendedUser,只需添加一个登录名即可。每个与登录相关的用户都是一个“扩展用户”。
关于java - Hibernate:将子类的实例转换为父类(super class)的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20044805/