19

名前付きクエリを orm.xml に入れようとしています (persistence.xml を使用して META-INF に入れます) が、orm.xml は hibernate/jpa によって無視されるようです。

em.createNamedQuery("myQuery") で名前付きクエリを作成しようとすると、このクエリが見つからないというメッセージが返されます。

私は注釈を使用しており、名前付きクエリを orm.xml で外部化したいと考えています (それだけです)。

ここに私のpersistence.xmlがあります:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
    <mapping-file>META-INF/orm.xml</mapping-file>

    <class>com.mysite.Account</class>

    <properties>
        <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" />
        <property name="hibernate.cache.use_query_cache" value="true" />
        <property name="hibernate.cache.use_second_level_cache" value="true" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="use_sql_comments" value="false" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MYSQLDialect" />
        <property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.max_size" value="20" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.idle_test_period" value="3000" />

        <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider" />
    </properties>

</persistence-unit>

</persistence>

ここに私のorm.xmlがあります

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">

<package>com.mysite</package>

<entity class="Account">
    <sql-result-set-mapping name="nicknames">
        <column-result name="nickname" />
    </sql-result-set-mapping>
    <table name="Account" />
    <named-native-query name="myQuery" result-set-mapping="nicknames">
        <query><![CDATA[select a.nickname from Account a]]>
    </query>
    </named-native-query>
</entity>
</entity-mappings>

私が間違っていることは何ですか?orm.xml が無視されるのはなぜですか?

ありがとう

4

4 に答える 4

9

やっと手に入れた!

orm.xmlをMETA-INFディレクトリに保存していました。このファイルをドメインオブジェクト(例:com.mysite)があるパッケージに移動すると、orm.xmlは無視されず、すべて実行されます。

また、mapping-file(persistence.xml)のパスを変更する必要があります:com / mysite / orm.xml

于 2010-03-04T14:50:50.430 に答える
5

orm.xmlには、全体を壊す小さなエラーがあります。重要なのは、要素の宣言のシーケンスがそれぞれのXMLスキーマ(特にhttp://java.sun.com/xml/ns/persistence/orm_1_0.xsd )に準拠している必要があるということです。これは、xmlスキーマを尊重するバリデーターを介してxmlコードを実行することで簡単に確認できます。以下は、チャームとして機能する必要があるorm.xmlの修正バージョンです。

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="
                     http://java.sun.com/xml/ns/persistence/orm
                     http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                 version="1.0">

    <package>com.mysite</package>

    <entity class="Account">
        <table name="Account" />
        <named-native-query name="myQuery" result-set-mapping="nicknames">
            <query><![CDATA[
            select a.nickname from Account a
            ]]></query>
        </named-native-query>
        <sql-result-set-mapping name="nicknames">
            <column-result name="nickname" />
        </sql-result-set-mapping>
    </entity>
</entity-mappings>
于 2011-10-27T19:39:14.240 に答える
2

言われるように

em.createNamedQuery( "myQuery")を使用して名前付きクエリを作成しようとすると、このクエリが見つからないことが返されます

あなたが正しいです。しかし、あなたは次のことを忘れます

ルートではなく要素内に名前付きクエリ定義を配置すると、エンティティクラスの名前がプレフィックスとして付けられます

したがって、namedQueryを次のように呼び出す必要があります

 em.createNamedQuery("Account.myQuery")

私は興味があります:あなたのアカウントクラスはルートクラスパスに保存されていますか?そうでない場合は、不足しているパッケージを修正しています。Accountクラスがbr.com.hibernate.model.domain.Account内に格納されているとします。したがって、エンティティを次のように宣言する必要があります

<entity class="br.com.hibernate.model.domain.Account" instead

そして、namedQueryを次のように呼び出す必要があります

em.createNamedQuery("br.com.hibernate.model.domain.Account.myQuery") instead

ただのアドバイス:永続性プロバイダーとしてHibernateを使用している場合、persistence.xmlファイルでエンティティークラスを定義する必要はありません。

よろしく、

于 2010-03-04T05:05:48.350 に答える
0

「META-INF/orm.xml」は、JPA 準拠のエンティティ マネージャが参照するデフォルトのマッピング ファイルです。

実際、マッピング ファイルが「META-INF/orm.xml」の場合、persistence.xml でそれを定義する必要さえありません。

これは、休止状態の構成マニュアルがこれについて述べていることです。

class 要素は、マッピングする EJB3 準拠の XML マッピング ファイルを指定します。ファイルはクラスパスにある必要があります。EJB3 仕様に従って、Hibernate EntityManager は META_INF/orm.xml の jar ファイルにあるマッピング ファイルをロードしようとします。もちろん、明示的なマッピング ファイルもロードされます。実際のところ、マッピング ファイル要素に任意の XML ファイルを指定できます。hbm ファイルまたは EJB3 デプロイメント記述子のいずれか。

参考:休止状態の設定

于 2011-03-28T02:23:37.333 に答える