【问题标题】:handle an inheritance hierarchy 3 levels deep with jpa使用 jpa 处理 3 级深度的继承层次结构
【发布时间】:2013-05-28 12:03:25
【问题描述】:

我在 jpa 中实现继承时遇到问题。我有以下实体:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED)
public class Person implements Serializable{
private String name;
private String }

@Entity 
@Inheritance(strategy=InheritanceType.JOINED)    
public class User extends Person {
private String salary;}

public class chef extends User{}

我希望所有实体都是具体的,这是正确的还是我应该改变一些东西?

【问题讨论】:

  • 好像没问题,你的问题是什么?
  • 我想在表 chef 中插入一个存在于表 user 中的用户: User chef = new Chef(); chef = (User) dao.trouverPersonneParId("mark"); dao.ajout_createur(厨师);但我有这个错误:java.lang.ClassCastException: com.pfe.domaine.User cannot be cast to com.pfe.domaine.Chef
  • 你能发布关于你的 dao 的代码吗?似乎在某些时候有从UserChef 的演员表,这就是为什么我想看看你在做什么,看看我能不能帮你。
  • here is my DAO : public void ajout_createur(User d) { em.getTransaction().begin(); em.persist(((Chef) d)); em.getTransaction().commit(); System.out.println(" CHEF ADDED!"); }
  • 在这种情况下,您是否验证过对象d 的类型确实是ChefChef 类是否也映射为实体? (我在 Chef 类中没有看到该实体配置?

标签: inheritance jpa eclipselink


【解决方案1】:

看起来您的用户条目可以独立于 Chef 表条目。 Java 继承不允许您切换对象以使其成为不同的类 - 对象是用户或厨师。 JPA Joined 继承遵循 Java 继承规则,因此 Chef 表中的行与 User 表行绑定,因为它们是单个实体。

因此,如果您有一个 User 实体,则不能将其设为 Chef 实体。听起来您需要的是可以分配角色的用户,例如厨师。一种方法是映射您在评论中提到的类型字段 - 但它不会让您访问 Chef 表数据 - 您仍然不能使用它来切换实例以成为 Chef。如果您需要数据,您可以创建 User 和 Chef 独立实体,并让 User 具有 1:1 映射,例如角色,可以为其分配包含相关数据和业务规则的 Chef 实体。

【讨论】:

  • 好的,谢谢@Chris。 1:1 映射的解决方案是个好主意,但对我来说我不需要访问 Chef 表数据
猜你喜欢
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多