我在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。但我敢打赌,有更好的方法可以做到这一点。
由于
答案 0 :(得分:1)
(...)但是在我执行最后一行之后,User和Admin表中都插入了另一行。我该如何解决这个问题?
好吧,你创建了一个Admin
的新实例,并在其上调用了persist
,所以这正是你告诉Hibernate要做的。尝试将获取的User
实例转发为Admin
而不是(未经测试)。
但IMO的某些内容已经破坏了你的设计,你应该指定某种角色,而不是在这里使用继承。