【问题标题】:Toplink JPA Inheritance - Summary/Detail relationshipToplink JPA 继承 - 摘要/细节关系
【发布时间】:2012-08-20 04:42:15
【问题描述】:

我在 web 应用程序中使用 toplink JPA,我只想将一个表映射到类层次结构。我想要一个代表大部分数据的类,以及一个继承自该类的类(因此它获取超类的所有字段,以及其他几个保存大量数据的字段)。我不希望一直有大量数据,也不希望将它们保存在请求对象等中。我只想要有人选择其中一个摘要时的大位。我已按如下方式设置类(简化为示例)。

@Entity
@Table(name = "TRANSCRIPTS")
@MappedSuperclass //also tried without this - same error
public class Summary {

    @Id
    @Column(name = "id")
    private long id;
    @Column(name = "title")
    private String title;

    //rest of class etc.
}

@Entity
@Table(name = "TRANSCRIPTS")
public class Detail extends Summary {

    @Id
    @Column(name = "fullText")
    private String fullText;

    //rest of class etc.
}

当我尝试使用此层次结构获取数据时,我收到一个错误,类似于

Unknown column 'DTYPE'

所以它正在寻找一个描述符列。我没有设置,因为它不是那种关系。

有没有其他方法可以在 JPA 中映射此摘要/详细信息关系?或者我应该放弃类继承并拥有两个独立的不相关的类,一个代表汇总数据,一个代表完整数据(并重新定义汇总字段)。

谢谢。

【问题讨论】:

    标签: java inheritance jpa orm toplink


    【解决方案1】:

    DTYPE 它是 Toplink 尝试访问以在您的实体之间进行选择的鉴别器列, 如果您将该列添加到表架构中,它将开始工作。

    DTYPE 是数据库中的 INTEGER 类型列。

    您可以使用以下代码 sn-p 指定自己的鉴别器列:

    @Entity
    @DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.INTEGER)
    @DiscriminatorValue("1")
    class TestClass {}
    

    这是给你的一些文档http://www.oracle.com/technetwork/middleware/ias/toplink-jpa-annotations-096251.html#CHDJHIAG

    【讨论】:

    • 所以我只需要此列存在,它不需要做任何事情?
    • 这将有助于 toplink 了解数据库表中的哪一行属于您的类中的哪个实体。它将包含生成的值,或者您将在 @DiscriminatorValue 注释中键入的值。它称为鉴别器列。
    • 但是每一行都与两个类相关——这些类代表相同的数据项,只是它的一个子集。这不像表 1 代表一般人,表 2 代表教师,我想要一堂给人的课,一堂只给老师的课。因此,就数据库而言,没有什么可区分的。此列中的所有行都将具有相同的值。
    • 不,你需要设置@DiscriminatorValue("teacher") class Teacher{}和@DiscriminatorValue("peaople")class People{}
    猜你喜欢
    • 2010-10-27
    • 2013-10-30
    • 1970-01-01
    • 2022-01-14
    • 2011-08-20
    • 2011-05-31
    • 2011-07-31
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多