J'ai un fichier persistance.xml très simple:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
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">
<persistence-unit name="eventractor" transaction-type="RESOURCE_LOCAL">
<class>pl.michalmech.eventractor.domain.User</class>
<class>pl.michalmech.eventractor.domain.Address</class>
<class>pl.michalmech.eventractor.domain.City</class>
<class>pl.michalmech.eventractor.domain.Country</class>
<properties>
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
et il fonctionne.
Mais lorsque je supprime des <class>
éléments, l'application ne voit pas les entités (toutes les classes sont annotées avec @Entity
).
Existe-t-il un mécanisme automatique pour rechercher des @Entity
classes?
Dans l'environnement Java SE, par spécification, vous devez spécifier toutes les classes comme vous l'avez fait:
et
(JSR-000220 6.2.1.6)
Dans les environnements Java EE, vous n'êtes pas obligé de le faire car le fournisseur recherche les annotations pour vous.
Officieusement, vous pouvez essayer de définir
<exclude-unlisted-classes>false</exclude-unlisted-classes>
dans votre persistence.xml. Ce paramètre est défini par défaut surfalse
EE ettrue
SE. Les deux EclipseLink et Toplink soutient jusqu'à ce que je peux dire. Mais vous ne devez pas compter sur son fonctionnement en SE, selon les spécifications, comme indiqué ci-dessus.Vous pouvez ESSAYER ce qui suit (peut ou non fonctionner dans les environnements SE):
la source
<exclude-unlisted-classes>false</exclude-unlisted-classes>
n'a pas fonctionné avec WildFly 8.2.1.Final + Hibernate 4.3.7Non, pas nécessairement. Voici comment procéder dans Eclipse (testé par Kepler):
Faites un clic droit sur le projet, cliquez sur Propriétés , sélectionnez JPA , dans la gestion des classes de persistance, cochez Découvrir automatiquement les classes annotées .
la source
persistence.xml
ce qu'Eclipse génère.Pour ceux qui exécutent JPA au printemps, à partir de la version 3.1, vous pouvez définir la
packagesToScan
propriété sousLocalContainerEntityManagerFactoryBean
et vous débarrasser complètement de persistence.xml.Voici le bas
la source
Vous pouvez fournir le
jar-file
chemin de l'élément vers un dossier avec des classes compilées. Par exemple, j'ai ajouté quelque chose comme ça lorsque j'ai préparé persistence.xml à certains tests d'intégration:la source
pour JPA 2+ cela fait l'affaire
scannez tous les bocaux en guerre pour les classes @Entity annotées
la source
java.lang.IllegalArgumentException: Unable to visit JAR file:
).Hibernate ne prend pas en charge
<exclude-unlisted-classes>false</exclude-unlisted-classes>
sous SE (un autre poster a mentionné que cela fonctionne avec TopLink et EclipseLink).Il existe des outils qui génèrent automatiquement la liste des classes vers persistence.xml, par exemple l'assistant d'importation de schéma de base de données dans IntelliJ. Une fois que vous avez les classes initiales de votre projet dans persistence.xml, il devrait être simple d'ajouter / supprimer des classes individuelles à la main au fur et à mesure que votre projet progresse.
la source
Je ne sais pas si vous faites quelque chose de similaire à ce que je fais, mais je génère une charge de source java à partir d'un XSD en utilisant JAXB dans un composant séparé en utilisant Maven. Disons que cet artefact est appelé "modèle de base"
Je voulais importer cet artefact contenant la source java et exécuter hibernate sur toutes les classes de mon jar d'artefact "modèle de base" et ne pas les spécifier explicitement. J'ajoute "base-model" comme dépendance pour mon composant hibernate mais le problème est que la balise dans persistence.xml vous permet seulement de spécifier des chemins absolus.
La façon dont je l'ai contourné est de copier explicitement ma dépendance jar "modèle de base" dans mon répertoire cible et de supprimer la version de celui-ci. Ainsi, alors que si je construis mon artefact "base-model", il génère "base-model-1.0-SNAPSHOT.jar", l'étape de copie-ressources le copie comme "base-model.jar".
Donc, dans votre pom pour le composant hibernate:
Ensuite, j'appelle le plugin hibernate dans la phase suivante "process-classes":
et enfin dans mon persistence.xml, je peux définir explicitement l'emplacement du jar ainsi:
et ajoutez la propriété:
la source
Ce n'est pas une solution mais un indice pour ceux qui utilisent Spring:
J'ai essayé de l'utiliser
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
avec le réglagepersistenceXmlLocation
mais avec cela, je devais fournir les<class>
éléments (même si ceux-cipersistenceXmlLocation
venaient de pointerMETA-INF/persistence.xml
).Lorsque je n'utilise pas,
persistenceXmlLocation
je pourrais omettre ces<class>
éléments.la source
persistenceXmlLocation
propriété dans mesLocalContainerEntityManagerFactoryBean
paramètres. Mais toutes les requêtes fonctionnent même si j'omets les<class>
éléments. C'est sur une application Spring / Hibernate / Maven. Mais dans votre allusion, vous dites que "lorsque je n'utilise pas persistenceXmlLocation, je pourrais omettre ces éléments <class>." mais c'est l'inverse pour moi.Je ne suis pas sûr que cette solution soit conforme aux spécifications, mais je pense que je peux partager pour d'autres.
arbre de dépendance
mes-entités.jar
Contient uniquement des classes d'entités. Non
META-INF/persistence.xml
.mes-services.jar
Cela dépend
my-entities
. Contient uniquement des EJB.my-resources.jar
Cela dépend
my-services
. Contient des classes de ressources etMETA-INF/persistence.xml
.problèmes
<jar-file/>
element inmy-resources
comme nom d'artefact postfixé de version d'une dépendance transitoire?<jar-file/>
valeur de l' élément et celle de la dépendance transitoire réelle?Solution
Dépendance directe (redondante?) et filtrage des ressources
J'ai mis une propriété et une dépendance
my-resources/pom.xml
.Maintenant, préparez-
persistence.xml
vous à être filtréPlugin Maven Enforcer
Avec la
dependencyConvergence
règle, nous pouvons garantir que lamy-entities
«version est la même en direct et transitif.la source
Pas nécessairement dans tous les cas.
J'utilise Jboss 7.0.8 et Eclipselink 2.7.0. Dans mon cas, pour charger des entités sans ajouter la même chose dans persistence.xml, j'ai ajouté la propriété système suivante dans Jboss Standalone XML:
<property name="eclipselink.archive.factory" value="org.jipijapa.eclipselink.JBossArchiveFactoryImpl"/>
la source