【问题标题】:Multiple entities based on single view基于单个视图的多个实体
【发布时间】:2012-11-13 13:21:23
【问题描述】:

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

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

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 用作@Ids 吗?它们在视图中并不是唯一的,但是像 SELECT DISTINCT STUDENT_ID, STUDENT_NAME FROM THE_VIEW 这样的操作会让它们变得独一无二……JPA 如何处理这些事情?

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

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

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

【问题讨论】:

    标签: java jpa orm oracle11g eclipselink


    【解决方案1】:

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

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

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

    【讨论】:

    • 不幸的是,我没有对表格本身的读取权限。根据该数据库的管理员的说法,“数据就在那里”(这是真的),他拒绝让我访问这些表。
    • 你的例子并没有真正回答我的问题。在我的情况下,您正在使用的 @EmbeddedId 将是巨大的(10+ 个字段),所以我想知道是否可以将 @Id 字段添加到视图中并非真正唯一的列。我基本上想要SELECT DISTINCT STUDENT_ID, STUDENT_NAME FROM THE_VIEW的结果。
    • 不行,@Id 列需要映射到唯一标识记录的字段上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2017-12-08
    • 2016-12-05
    相关资源
    最近更新 更多