基于单一视图的多个实体

时间:2012-11-13 13:21:23

标签: java jpa orm oracle11g eclipselink

我正在建立一个基于远程数据库模式的域模型,该模式只为我提供单一视图。该视图是许多不同表的完全连接,这意味着存在大量重复数据。

视图看起来有点像这样(它实际上要大得多,但想法是一样的):

STUDENT_ID     STUDENT_NAME     CLASS_ID     CLASS_NAME     YEAR_ID     YEAR
----------------------------------------------------------------------------
1              Jane             1            Maths          1           2001
1              Jane             2            Biology        1           2001
2              Adam             2            Biology        1           2001
2              Adam             2            Biology        2           2002
NULL           NULL             1            Maths          2           2002
3              Pete             NULL         NULL           NULL        NULL
NULL           NULL             3            Physics        NULL        NULL
NULL           NULL             NULL         NULL           3           2003

正如我们所看到的,它是表STUDENTCLASSYEAR的完全连接。

有些学生

我想制作3个实体类:StudentClassYear;每个人持有一个ID和名称:

@Entity
@Table(name = "THE_VIEW")
public class Student implements Serializable {

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

    @Column(name = "STUDENT_NAME")
    private String name;

    /* Getters, setters and references to other entities */
}

@Entity
@Table(name = "THE_VIEW")
public class Clazz implements Serializable {

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

    @Column(name = "CLASS_NAME")
    private String name;

    /* Getters, setters and references to other entities */
}

我可以将STUDENT_IDCLASS_ID用作@Id吗?它们在视图中并不是唯一的,但是像SELECT DISTINCT STUDENT_ID, STUDENT_NAME FROM THE_VIEW那样做会让它们变得独一无二...... JPA如何处理这些事情?

对所有ID使用复合主键:s当然可以,但它必须包含许多字段,我真的想避免这种情况。

有关解决此问题的其他建议吗?我们现在可以忽略与其他实体类型的关系。

JPA实现是eclipselink 2.2.0,数据库是Oracle 11g

1 个答案:

答案 0 :(得分:0)

首先,我会使用真实的表,而不是这个视图。限制自己没有任何意义。我假设您的应用程序是只读的?看不出你怎么写这个观点。

如果必须使用视图,则创建映射到它的对象,并将实际模型对象定义为嵌入。

@Entity
public StudentClassAssignment {
  @EmbeddedId
  StudentClassAssignmentId
  @Embedded
  Student student
  @Embedded
  SchoolClass schoolClass      
  @Embedded
  Year year
}