Hibernate将实例转换为子类

时间:2010-07-14 09:24:23

标签: java hibernate inheritance orm jpa

我在JPA中映射了类。 :

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class User {
    private Long id;
    private Long name;
    //getters and setters go here
    ....
}

我也有这个类的子类,名为Admin:

@Entity
public class Admin extends User {
    private String cridentials;
    //getters and setters go here
    ....
}

现在在我的代码中,我已经管理了附加到会话的用户实例

...
User user = entityManager.find(User.class, userId)

我需要将此用户转换为其子类Admin。这意味着我需要“用户”表数据保持不变,并将新行插入“管理员”表中:

javax.persistence.EntityManager entityManager = ...;
...
User user = entityManager.find(User.class, userId)
Admin admin = new Admin();
admin.setName(user.getName());

entityManager.persist(admin);

但是在执行最后一行之后,User和Admin表中都插入了另一行。我该如何解决这个问题?

到目前为止,我找到的唯一方法是在某处保存用户的字段,然后从DB中删除此实例,然后使用User类中的所有数据创建新的Admin。但我敢打赌,有更好的方法可以做到这一点。

由于

1 个答案:

答案 0 :(得分:1)

  

(...)但是在我执行最后一行之后,User和Admin表中都插入了另一行。我该如何解决这个问题?

好吧,你创建了一个Admin的新实例,并在其上调用了persist,所以这正是你告诉Hibernate要做的。尝试将获取的User实例转发为Admin而不是(未经测试)。

但IMO的某些内容已经破坏了你的设计,你应该指定某种角色,而不是在这里使用继承。