0

まず第一に、私は 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 で広く使用されています。

ありがとう

メイサム・テ。

4

1 に答える 1

4

GenericEntity クラスに で注釈を付け、@MappedSuperclass各エンティティに で注釈を付けるだけです@AttributeOverride(s)

注釈の javadoc で説明されています。

于 2012-07-23T16:45:18.300 に答える