2010-07-14 89 views
2

我已经在JPA中映射了类。 :Hibernate将实例转换为子类

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

我也有这个类的子类,称为管理员:连接到会议

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

我需要用户的

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

现在在我的代码,我管理的实例将此用户转换为其子类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。但我敢打赌,这样做有更好的方法。

感谢

回答

1

(...)但是我执行最后行后,另一行插入两个用户和管理员表所示。我将如何解决这个问题?

嗯,你创建了一个新的实例的Admin并叫persist所以这正是你告诉Hibernate的人。尝试将提取的User实例向下转换为Admin,而不是(未测试)。

但是有些东西在你的设计中破坏了,你应该指定某种角色,而不是在这里使用继承。

+0

其实,管理员有许多属性,用户不应该有 - 这就是为什么我使用继承。用户无法下载到管理员,因此 '管理员a =(管理员)用户;' 在这里不起作用...用户不是抽象的问题,它由系统和管理员使用。然而,我不能'告诉'hibernate从当前用户创建新的管理员 - 即使当我将管理员的ID设置为用户的一个并尝试合并时,它会说管理员不受管理。 – 2010-07-14 14:48:23