まず第一に、私は JPA と Hibernate Annotations に非常に慣れていません。
私は、現在のフレームワークで開発された多くのシステムとソリューションを持っています。これは、データ アクセス レイヤーの hibernate 3.5 と hbm.xml に基づいています。hibernate 4.1 と Annotation に移行し、hbm.xml ファイルを削除することにしました。
しかし、ここに私の問題があります。
「id」とその他のフィールド(「バージョン」など)を含む GenericEntity という名前のすべてのエンティティの基本クラスがあります。この GenericEntityは物理テーブルに直接マップされず、各エンティティはこれらのフィールドを物理テーブル/列にマップする責任があります。
Annotation では、エンティティの id および version フィールド/注釈を省略する方法が見つかりませんでした
ここに私が持っているものがあります:
public abstract class GenericEntity implements Serializable {
public static final short UNSAVED_VALUE = -1;
private long id = UNSAVED_VALUE;
private int version;
... getters and setters
}
public class User extends GenericEntity {
private String username;
private String password;
... getters and setters
}
そしてhbm.xmlは
<class name="my.User" table="TBL_USER" optimistic-lock="version">
<id name="id" column="USR_ID" unsaved-value="-1">
<generator class="identity"/>
</id>
<version name="version" column="USR_VERSION"/>
<property name="username" column="USR_USERNAME" type="string" />
<property name="password" column="USR_PASSWORD" type="string" />
</class>
GenericEntity のマッピングはなく、GenericEntity に関する User の継承マッピングはありません。
どうすればアノテーションでそれを行うことができますか?!!
解決策は getId と setId を抽象メソッドとして定義することですが、何万ものエンティティに id と version を追加することはできません。
また、GenericEntity に休止状態の継承を使用することはできません。なぜなら、現在のテーブルを簡単に変更することはできず、一方でパフォーマンスに多くのペナルティがかかるからです。
また、フレームワークの他の部分の変更を最小限に抑えたいと考えています。GenericEntity は DAL で広く使用されています。
ありがとう
メイサム・テ。