【问题标题】:Hibernate mapping table for subclass子类的休眠映射表
【发布时间】:2012-12-07 05:14:27
【问题描述】:

我有 3 个课程:

Person {
    int id;
    String name;
    String lastName;
}

Employee extends Person {
    //some additional data
}

Owner extends Person {
    //some additional data
}

对于每个班级,我都有单独的表格。在Employee 表中,键应与Person 表中的键完全相同。

现在,当我插入 Employee 类时,Person 表中应该有一个记录,Employee 中应该有一个具有相同 ID 的记录(假设这是值 1)。

之后我想插入 Owner 类并且我希望它是同一个 Person (ID=1) 所以在插入 Owner 之后应该在表 Owner 中只添加一条记录,但表 Person 中的记录应该保留原样是。

我试过这个:http://viralpatel.net/blogs/hibernate-inheritance-table-per-subclass-annotation-xml-mapping/

插入第一个类是可以的,插入具有不同 ID 的第二个是可以的,从 db 获取对象是可以的,但是我想添加具有相同 ID 的 Owner 类,例如我得到 hibernateException 的现有人......谁能帮忙我?

【问题讨论】:

    标签: hibernate mapping


    【解决方案1】:

    这根本不可能。由于Java只有单一继承,一个对象不能既是雇员又是所有者。您不应该使用继承来映射这些关联。

    相反,您应该让 Person 与其 Employee 角色有一个 OnetoOne 关联,并与其 Owner 角色有一个 OnetoOne 关联。

    【讨论】:

    • “这根本不可能。”在我的代码示例中,Employee 扩展 Profile,Owner 扩展 Profile。
    • 如果 Java 对象是 Owner 的实例,则它不能是 Employee 的实例,反之亦然。因此,当通过 ID 加载人员时,Hibernate 将无法判断要返回哪种实体,而在员工和所有者表中都有一行。这是不可能的。
    • 我理解这一点,但我希望有一种方法可以通过实现接口替换继承,或者通过在代码中实现继承来欺骗休眠,但是在休眠中进行组合。所有者扩展了 AbstractPerson,并且 AbstractPerson 包含 Preson 作为字段,但我不知道如何在休眠中映射它,因为我无法从父 i 映射文件访问 person 字段:/ 我的第二个问题是我想要 Person ID 也是 Owner 类中的主键...
    【解决方案2】:

    “这根本不可能。”在我的代码示例中,员工扩展个人资料,所有者扩展个人资料。

    如果我完全理解你的回答,你会提出这样的建议:

    Person{
    Employee emp;
    Owner owner;
    }
    

    在我的第一堂课中,我能够做到:

    Person getPersonFromDb( Class class, int id){  ...  session.get(class, id) ... }
    
    Owner o = (Owner) getPersonFromDb(Owner.class, id);
    Employee e =(Employee) getPersonFromDb(Employee.class, id);
    

    在你的方法中我不能有这样的东西......

    【讨论】:

    • 答案不应用于评论其他答案。使用 cmets 执行此操作,或编辑您的问题。并查看我在答案中发布的评论。
    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多