J'essaie de placer mes requêtes nommées dans mon fichier orm.xml (dans META-INF avec persistence.xml), mais mon fichier orm.xml semble être ignoré par hibernate/jpa.
Lorsque j'essaie de créer ma requête nommée avec em.createNamedQuery ("myQuery"), il renvoie qu'il ne peut pas trouver cette requête.
J'utilise des annotations et j'aimerais externaliser mes requêtes nommées dans orm.xml (uniquement).
Voici mon 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>
voici mon 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>
Qu'est-ce que je fais mal? Pourquoi mon fichier orm.xml est-il ignoré?
merci
Ok je l'ai finalement eu!
Je sauvegardais mon fichier orm.xml dans le répertoire META-INF. Lorsque je déplace ce fichier vers mon package contenant mon objet de domaine (comme dans mon exemple: com.mysite), le fichier orm.xml n'est pas ignoré et est exécuté.
J'ai également besoin de changer le chemin d'accès dans le fichier de mappage (persistence.xml): com/mysite/orm.xml
Votre orm.xml a une erreur mineure qui casse tout. Le fait est que la séquence des déclarations d'éléments doit être conforme au schéma XML respectif (qui est http://Java.Sun.com/xml/ns/persistence/orm_1_0.xsd en particulier). Cela est facile à vérifier en exécutant le code XML via un validateur qui respecte les schémas XML. Vous trouverez ci-dessous la version corrigée de votre fichier orm.xml qui doit fonctionner comme un charme.
<?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>
Comme dit
Lorsque j'essaie de créer ma requête nommée avec em.createNamedQuery ("myQuery"), il renvoie qu'il ne peut pas trouver cette requête .
Tu as raison. Mais vous oubliez ce qui suit
Si vous placez une définition de requête nommée dans un élément, au lieu de la racine, elle est préfixée du nom de la classe d'entité
Donc, vous devez appeler votre namedQuery en tant que
em.createNamedQuery("Account.myQuery")
Je suis curieux: votre classe Account est-elle stockée dans le chemin de classe racine ??? Sinon, vous devez réparer le paquet manquant. Supposons que la classe Account soit stockée dans br.com.hibernate.model.domain.Account. Donc, vous devriez déclarer votre entité comme
<entity class="br.com.hibernate.model.domain.Account" instead
Et vous devez appeler votre namedQuery en tant que
em.createNamedQuery("br.com.hibernate.model.domain.Account.myQuery") instead
Juste un conseil: lorsque vous utilisez Hibernate en tant que fournisseur de persistance, vous n'avez pas besoin de définir votre classe Entity dans le fichier persistence.xml.
cordialement,
"META-INF/orm.xml" est le fichier de mappage par défaut qui sera considéré par tout gestionnaire d'entités conforme à JPA.
En fait, si votre fichier de mappage est "META-INF/orm.xml", vous n'avez même pas besoin de définir cela dans votre persistence.xml.
Voici ce que dit le manuel de configuration d'Hibernate à ce sujet:
L'élément class spécifie un fichier de mappage XML conforme à EJB3 que vous allez mapper. Le fichier doit être dans le classpath. Conformément à la spécification EJB3, Hibernate EntityManager essaiera de charger le fichier de mappage situé dans le fichier jar à l'adresse META_INF/orm.xml. Bien entendu, tout fichier de mappage explicite sera également chargé. En fait, vous pouvez fournir n’importe quel fichier XML dans l’élément de fichier de mappage, c’est-à-dire. fichiers hbm ou descripteur de déploiement EJB3.