2012-08-24 42 views
1

我在webapp中使用toplink JPA,我只想将一个表映射到类层次结构。我想要一个类代表大部分数据,一个类继承它(因此它获得了超类的所有字段以及另外一些包含大量数据的类)。我一直不想要大量的数据,也不想让它们保存在请求对象中等等。我只想在有人选择其中一个摘要时使用大数据。我已经设置了如下的类(作为示例简化)。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' 

所以它在寻找一个descriminator列线的错误。我还没有设置,因为它不是那种关系。

有没有一种不同的方式可以在JPA中映射此摘要/详细信息关系?或者我应该放弃类继承,并且有两个单独的不相关的类,一个表示摘要数据,一个表示全部数据(并重新定义摘要字段)。

谢谢。

回答

1

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

DTYPE是INTEGER在数据库中键入的列。

你可以使用下面的代码片段指定自己的鉴别柱:

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

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

+0

所以我只需要此列存在,它没有做什么? – ssloan

+0

它将帮助toplink了解数据库表中的哪一行属于您的类中的哪个实体。它将包含您将在@DiscriminatorValue注释中输入的生成值或值。它称为鉴别器列。 –

+0

但是每行都与两个类有关 - 类表示相同的数据项,只是它的一个子集。这不是像表1代表一般人,表2代表教师,我希望为教师提供一个班级和一个班级。所以就数据库而言,没有任何区别。所有行在此列中都具有相同的值。 – ssloan