3

私はかなり大規模な(新しい)プロジェクトを持っており、JPAマッピングで多くのドメインクラスに注釈を付けています。今度は、多くの名前付きクエリを実装するときです。一部のエンティティには、15〜20もの名前付きクエリが含まれる場合があります。これらの名前付きクエリをアノテーションで記述するとソースファイルが乱雑になると考えているため、これらをXMLマッピングファイルに入れることを検討しています。

これは可能ですか?

重要なのは、これは合理的ですか?

より良いアプローチはありますか?

これはどのように行われますか?

4

3 に答える 3

6

これは可能ですか?

はい、そうですが、傾向は逆ではなく、物事を集中化することです。

さらに重要なことに、これは合理的ですか?

エンティティクラスファイルの上部に注釈のブロックがあることに悩まされることはありません実際、はクエリが属すると思う場所、つまりエンティティの隣にクエリを配置するのが好きです。また、コンパイル時のチェック(エンティティ名、属性)と、Javaコードでクエリを作成するときに取得するコード補完も気に入っています(IDEがxmlマッピングでそれを行うかどうかはわかりません)。言い換えれば、はその必要性を感じず、クエリを外部化したくありません。

より良いアプローチはありますか?

アノテーションを使用することがベストプラクティスだと思います1

これはどのように行われますか?

XMLマッピングファイルは、特定のデータベースに固有のネイティブSQLステートメントにのみ使用することをお勧めします(もちろん、注釈を付けることができないレガシーコードの明らかなケースは省略します)。つまり、アノテーションを使用しますが、コードにはベンダー固有のものをできるだけ含まないようにします。

1 JPA1.0仕様の共同リーダーであるMikeKeithは、OTN列の「注釈を付けるかどうか」で、XMLメタデータ戦略(XML戦略)とソース内メタデータ戦略(注釈戦略)に関連する多くのトレードオフを取り上げました。悲しいことに、私は彼の出版物への死んでいないリンクを見つけることができませんでした。たぶんあなたはもっと幸運になるでしょう、そしてその場合、それを読んでください。

于 2010-05-15T10:55:01.060 に答える
2

これは少し遅いことは知っていますが、これに遭遇し、私のプロジェクトではorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean(もちろん、Springコンテナー内)を使用しています。私はJPAが本当に好きで、それが人生を楽にしてくれると確信していますが、Hibernate、JPA、Springなどを使用しないプロジェクトでドメインクラスを使用したいと思います。可能であれば、一部のドメインクラスにJavaPersistenceアノテーションを付けない方がよいと判断しました。

これはおそらく多くの人にとって明らかな単純なことですが、しばらく時間がかかりました。以下は、注釈がないことに注意したPOJOの例です。

package mypackage.domain;
public class Profile {
    private Long id;
    private String friendlyName;
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getFriendlyName() { return friendlyName; }
    public void setFriendlyName(String friendlyName)
        { this.friendlyName = friendlyName; }
}

ディレクトリ(Mavenを使用しているsrc/main/java/mypackage/domain/場合)に、従来のXMLマッピングファイル(Profile.hbm.xml)を配置する必要があります。

<hibernate-mapping package="mypackage.domain" default-access="field">
<class name="Profile" table="Profile">
    <id name="id" column="ID">
        <generator class="native" />
    </id>
    <property name="friendlyName" column="FriendlyName" />
</class>
</hibernate-mapping>

問題のないHibernate4.0.0.CR3を使用している場合、Spring構成(私は3.0.6.RELEASEを使用しています)は、典型的なJPAHibernate構成のようになります。

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="database" value="SQL_SERVER" />
        <property name="showSql" value="true" />
    </bean>
    </property>
</bean>

META-INF/persistence.xmlはかなり基本的なものであり、完全を期すために次のようになります。

<persistence version="1.0">
    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>mypackage.domain.Profile</class>
    </persistence-unit>
</persistence>

もちろん、私はJPAを使用していますが、マッピング構成はHibernate固有であるため、このプロジェクトではHibernateに関連付けました。これは、レガシー姉妹プロジェクトで純粋なJDBCを使用しているため、そのような欠点とは見なされません。

于 2011-09-25T16:31:04.920 に答える
1

可能ですが、必要ないと思います。私は多くの大きなプロジェクトに取り組んでおり、いくつかのエンティティに多くの名前付きクエリがアタッチされていますが、これがソースを乱雑にすることはあまりないと思います-すべてのクエリがすべてクラス定義の前にある後です。注釈を使用する主な利点は、ソース内のすべてを表示できることです。xml構成でクエリを抽出した場合、名前付きクエリの存在はすぐには表示されないため、欠点と考えられます。私はものを純粋に保つのが好きです-xmlのみのセットアップまたは注釈のみのセットアップ。私が一般的にpersistence.xmlのJPAプロジェクトで保持している唯一のxml構成。

于 2010-05-15T04:44:36.627 に答える