0

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

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

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

正如我们所见,它是表 和 的STUDENT完全CLASS连接YEAR

有些学生是

我想做 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_IDand CLASS_IDas @Ids 吗?它们在视图中并不是唯一的,但是做一些类似的SELECT DISTINCT STUDENT_ID, STUDENT_NAME FROM THE_VIEW事情会使它们变得独一无二...... JPA 如何处理这些事情?

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

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

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

4

1 回答 1

0

首先,我会使用真实的表格,而不是这个视图。限制自己这样做是没有意义的。我假设您的应用程序是只读的?看不到您如何写入此视图。

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

IE

@Entity
public StudentClassAssignment {
  @EmbeddedId
  StudentClassAssignmentId
  @Embedded
  Student student
  @Embedded
  SchoolClass schoolClass      
  @Embedded
  Year year
}
于 2012-11-13T14:10:34.373 回答