【问题标题】:Hibernate Mapped Superclass relationships and overridingHibernate 映射的超类关系和覆盖
【发布时间】:2011-03-14 18:14:23
【问题描述】:

我有一个抽象的MappedSuperClass,Participant,它由三种'Participant'扩展而来。然后每个人都使用自己的“项目”,也是一个抽象的 MappedSuperClass。但是,我希望基类了解项目,以便我可以编写通用代码来与参与者交互。如何使用 Hibernate 注释指定这一点?以及如何在 ExtendedParticipant 和 ExtendedProject 类中覆盖它?

每种参与者类型和每种项目类型都有自己的数据库表,其中包含我无法更改的现有数据和 ID(在表中不是唯一的)。

下面的代码给了我 IDE 错误“多对一属性不应该是'映射超类'”。

@MappedSuperclass
public abstract class Participant implements Persistable {

    ...

    @ManyToOne
    @JoinColumn(name = "project_id")
    public Project getProject() {
        return project;
    }

    public void setProject(Project project) {
        this.project = project;
    }

    ...
}

Project 类与同样的问题大同小异:

@MappedSuperclass
public abstract class Project implements Persistable {

    ...

    @OneToMany
    public List<Participant> getParticipants() {
        return participants;
    }

    public void setProject(List<Participant> participants) {
        this.participants = participants;
    }

    ...
}

【问题讨论】:

    标签: java hibernate annotations


    【解决方案1】:

    映射的超类不是实体,它不能是关联的一部分。因此,将您的类映射为实体,并在它们“上方”引入映射的超类或使用TABLE_PER_CLASS 策略。

    另见

    【讨论】:

    • 谢谢帕斯卡,这是有道理的。我看到另一篇您对此发表评论的帖子,但我仍然不确定该怎么做。一定有办法使用基类建立所有关系?
    • @Andrew:嗯,为什么他们映射超类?你不能把公共属性放在它们上面的一个类中吗?另一个“选项”是将它们映射为实体并使用 TABLE_PER_CLASS 策略。
    • 这 3 个 ExtendedParticipant 类共享许多字段名称,所以我希望将所有这些都放在基类中,这就是我选择 Mapped SuperClass 的原因。我想我可以有一个没有映射的基类,但是我必须在每个 ExtendedParticipant 中包含每个字段...
    【解决方案2】:

    似乎可以通过映射超类定义关系 根据以下

    【讨论】:

      【解决方案3】:

      文档说这是可能的,但在示例中超类不是抽象的 https://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html

      【讨论】:

        猜你喜欢
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 1970-01-01
        相关资源
        最近更新 更多