0

リモート データベース スキーマに基づいてドメイン モデルを作成していますが、これは作業対象の 1 つのビューのみを提供します。ビューは多くの異なるテーブルの完全結合です。つまり、多くの重複データがあります。

ビューは次のようになります (実際にはもっと大きくなっていますが、考え方は同じです)。

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 つのエンティティ クラスを作成したい: StudentClassおよび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_IDandCLASS_ID@Idsとして使用できますか? それらはビューでは一意ではありませんが、次のようなSELECT DISTINCT STUDENT_ID, STUDENT_NAME FROM THE_VIEWことを行うと一意になります... JPAはこれらをどのように処理しますか?

すべての ID:s に複合主キーを使用することはもちろん可能ですが、多くのフィールドを含める必要があり、それを避けたいと思っています。

これを解決するための他の提案はありますか? 現時点では、他のエンティティ タイプとの関係は無視できます。

JPA 実装は eclipselink 2.2.0 で、データベースは Oracle 11g です。

4

1 に答える 1

0

まず、このビューではなく、実際のテーブルを使用します。これに自分を制限することは意味がありません。あなたのアプリは読み取り専用だと思いますか?このビューにどのように書き込むことができるかわかりません。

ビューを使用する必要がある場合は、ビューにマップするオブジェクトを作成し、実際のモデルオブジェクトを埋め込みとして定義します。

すなわち

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