名前付きクエリを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が無視されるのはなぜですか?
ありがとう
はい、やっとできました!
Orm.xmlをMETA-INFディレクトリに保存していました。このファイルを、私のドメインオブジェクト(私の例:com.mysiteなど)があるパッケージに移動すると、orm.xmlが無視されず、すべて実行されます。
また、mapping-file(persistence.xml)のパスを変更する必要があります:com/mysite/orm.xml
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>
言われるように
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ファイルで定義する必要はありません。
よろしく、
「META-INF/orm.xml」は、JPA準拠のエンティティマネージャーによって参照されるデフォルトのマッピングファイルです。
実際、マッピングファイルが「META-INF/orm.xml」の場合、persistence.xmlで定義する必要はありません。
これについては、Hibernate構成マニュアルに次のように記載されています。
クラス要素は、マップするEJB3準拠のXMLマッピングファイルを指定します。ファイルはクラスパスにある必要があります。 EJB3仕様に従って、Hibernate EntityManagerはMETA_INF/orm.xmlのjarファイルにあるマッピングファイルをロードしようとします。もちろん、明示的なマッピングファイルも読み込まれます。実際には、マッピングファイル要素に任意のXMLファイルを提供できます。 hbmファイルまたはEJB3デプロイメント記述子。