既存の本番データベースに、Students テーブルがあるとします。学生の大半は元です。現在の学生から切り離したい学生。より具体的には、現在在籍している学生用の Students テーブルを保持し、他の学生を Students_history テーブルに移動したいと考えています。同様に、Students に接続された他のいくつかのテーブルについても同様です。これの動機は、(school_name、student_id)を主キーとして持ちたいということであり、同じ学校がstudent_idを再割り当てすることがあるため、10年前に卒業した学生と現在在籍している別の学生に同じstudent_idを持つことになります。この student_id は、私の制御を超えたものであり、アプリケーションに入ってくるデータからのものです。2 つ目は、テーブルに対する多くの操作がはるかに高速になることです。
私が見つけた最善の解決策は、Students テーブルでトリガーを定義することです。トリガーを削除すると、学生 (および学生エントリを参照するその他のデータ) が対応する Student_history テーブルに移動します。私が理解しようとしている部分は、Hibernate をこれで動作させる方法です。現在機能しているように、Web アプリで両方のテーブル (Students と Students_history) のエントリを表示したいと思います。このデータを Web インターフェースで表示するために、GWT を使用しています。データは次の方法でフェッチされます。
Criteria criteria = session.createCriteria(Students.class);
条件を使用すると、Web アプリでアイテムを並べ替えたりフィルター処理したりするときに非常に役立ちます。次のように、読み込み用のカスタム クエリを指定してみました。
@Entity
@Table(name = "Students")
@Loader(namedQuery = "students")
@NamedNativeQuery(name = "students", query = "select * from students union all select * from students_history WHERE Id = ?", resultClass = Students.class)
クエリの後に、Students クラスの定義が続きます。これは機能しません。前述の基準で Hibernate が生成するクエリには、students_history への言及が含まれていません。
postgreSQL、Hibernate 4、および Java 1.6 を使用しています。
私の質問は次のとおりです。
- 現在の学生と古い学生を区別する正しい軌道に乗っていますか? これは、削除時にヘルパー テーブルとストアド プロシージャを使用することを意味します。
- Hibernate 基準は、@Loader アノテーションで定義されたカスタム読み込みクエリで機能しますか? Hibernate がローダー クエリを基準として使用することを期待していました。これが可能であれば、コード スニペットやリンクを歓迎します。