我正在建立一个基于远程数据库模式的域模型,该模式只为我提供单一视图。该视图是许多不同表的完全连接,这意味着存在大量重复数据。
视图看起来有点像这样(它实际上要大得多,但想法是一样的):
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个实体类:Student
,Class
和Year
;每个人持有一个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_ID
和CLASS_ID
用作@Id
吗?它们在视图中并不是唯一的,但是像SELECT DISTINCT STUDENT_ID, STUDENT_NAME FROM THE_VIEW
那样做会让它们变得独一无二...... JPA如何处理这些事情?
对所有ID使用复合主键:s当然可以,但它必须包含许多字段,我真的想避免这种情况。
有关解决此问题的其他建议吗?我们现在可以忽略与其他实体类型的关系。
JPA实现是eclipselink 2.2.0,数据库是Oracle 11g
答案 0 :(得分:0)
首先,我会使用真实的表,而不是这个视图。限制自己没有任何意义。我假设您的应用程序是只读的?看不出你怎么写这个观点。
如果必须使用视图,则创建映射到它的对象,并将实际模型对象定义为嵌入。
即
@Entity
public StudentClassAssignment {
@EmbeddedId
StudentClassAssignmentId
@Embedded
Student student
@Embedded
SchoolClass schoolClass
@Embedded
Year year
}