Ich habe eine sehr einfache persistance.xml-Datei:
<?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>
und es funktioniert.
Wenn ich jedoch <class>
Elemente entferne, werden in der Anwendung keine Entitäten angezeigt (alle Klassen sind mit Anmerkungen versehen@Entity
).
Gibt es einen automatischen Mechanismus zum Suchen nach @Entity
Klassen?
In der Java SE-Umgebung müssen Sie alle Klassen wie angegeben angeben :
und
(JSR-000220 6.2.1.6)
In Java EE-Umgebungen ist dies nicht der Fall tun, da der Anbieter nach Anmerkungen für Sie sucht.
Inoffiziell können Sie versuchen,
<exclude-unlisted-classes>false</exclude-unlisted-classes>
in Ihrer persistence.xml festzulegen. Dieser Parameter ist standardmäßigfalse
in EE undtrue
in SE. Sowohl EclipseLink als auch Toplink unterstützen dies, soweit ich das kann. Sie sollten sich jedoch nicht darauf verlassen, dass es gemäß den oben angegebenen Spezifikationen in SE funktioniert.Sie können Folgendes VERSUCHEN (kann in SE-Umgebungen funktionieren oder nicht):
quelle
<exclude-unlisted-classes>false</exclude-unlisted-classes>
funktionierte nicht mit WildFly 8.2.1.Final + Hibernate 4.3.7Nein, das musst du nicht. So geht's in Eclipse (Kepler getestet):
Klicken Sie mit der rechten Maustaste auf das Projekt, klicken Sie auf Eigenschaften , wählen Sie JPA aus , und aktivieren Sie im Kontrollkästchen Persistenzklassenverwaltung die Option Kommentierte Klassen automatisch erkennen .
quelle
persistence.xml
was Eclipse generiert.Für diejenigen, die JPA im Frühjahr ausführen, können Sie ab Version 3.1 die
packagesToScan
Eigenschaft unter festlegenLocalContainerEntityManagerFactoryBean
und persistence.xml insgesamt entfernen.Hier ist die Übersicht
quelle
Sie können einen
jar-file
Elementpfad zu einem Ordner mit kompilierten Klassen angeben. Zum Beispiel habe ich so etwas hinzugefügt, als ich persistence.xml für einige Integrationstests vorbereitet habe:quelle
Für JPA 2+ ist dies der Trick
Scannen Sie alle Gläser im Krieg nach kommentierten @ Entity-Klassen
quelle
java.lang.IllegalArgumentException: Unable to visit JAR file:
).Der Ruhezustand wird
<exclude-unlisted-classes>false</exclude-unlisted-classes>
unter SE nicht unterstützt (ein anderes Poster erwähnte, dass dies mit TopLink und EclipseLink funktioniert).Es gibt Tools, die die Liste der Klassen in persistence.xml automatisch generieren, z. B. den Assistenten zum Importieren von Datenbankschemas in IntelliJ. Sobald Sie die ersten Klassen Ihres Projekts in persistence.xml haben, sollte es einfach sein, einzelne Klassen im Verlauf Ihres Projekts von Hand hinzuzufügen / zu entfernen.
quelle
Ich bin mir nicht sicher, ob Sie etwas Ähnliches tun wie ich, aber ich generiere eine Ladung Quell-Java von einer XSD mit JAXB in einer separaten Komponente mit Maven. Nehmen wir an, dieses Artefakt heißt "Basismodell".
Ich wollte dieses Artefakt, das die Java-Quelle enthält, importieren und den Ruhezustand über alle Klassen in meinem Artefakt-Jar "Basismodell" ausführen und nicht jedes explizit angeben. Ich füge "Basismodell" als Abhängigkeit für meine Ruhezustandskomponente hinzu, aber das Problem ist, dass das Tag in persistence.xml nur die Angabe absoluter Pfade ermöglicht.
Die Art und Weise, wie ich es umgangen habe, besteht darin, meine "Basismodell" -Jar-Abhängigkeit explizit in mein Zielverzeichnis zu kopieren und auch die Version davon zu entfernen. Wenn ich also mein Artefakt "Basismodell" erstelle, wird "Basismodell 1.0-SNAPSHOT.jar" generiert, und der Schritt "Kopierressourcen" kopiert es als "Basismodell.jar".
Also in deinem Pom für die Hibernate-Komponente:
Dann nenne ich das Hibernate-Plugin in der nächsten Phase "Prozessklassen":
und schließlich kann ich in meiner persistence.xml die Position des Glases explizit so einstellen:
und fügen Sie die Eigenschaft hinzu:
quelle
Es ist keine Lösung, sondern ein Hinweis für diejenigen, die Spring verwenden:
Ich habe versucht,
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
mit Einstellung zu verwenden ,persistenceXmlLocation
aber damit musste ich die<class>
Elemente bereitstellen (auch wenn diepersistenceXmlLocation
gerade darauf hinwiesenMETA-INF/persistence.xml
).Wenn ich es nicht benutze,
persistenceXmlLocation
könnte ich diese<class>
Elemente weglassen .quelle
persistenceXmlLocation
Eigenschaft in meinenLocalContainerEntityManagerFactoryBean
Einstellungen verwendet. Aber alle Abfragen funktionieren, auch wenn ich die<class>
Elemente weglasse . Es ist auf einer Spring / Hibernate / Maven-Anwendung. In Ihrem Hinweis heißt es jedoch: "Wenn Sie persistenceXmlLocation nicht verwenden, kann ich diese <class> -Elemente weglassen." aber es ist umgekehrt für mich.Ich bin nicht sicher, ob diese Lösung unter der Spezifikation liegt, aber ich denke, ich kann sie für andere teilen.
Abhängigkeitsbaum
my-entity.jar
Enthält nur Entitätsklassen. Nein
META-INF/persistence.xml
.my-services.jar
Kommt drauf an
my-entities
. Enthält nur EJBs.my-resources.jar
Kommt drauf an
my-services
. Enthält Ressourcenklassen undMETA-INF/persistence.xml
.Probleme
<jar-file/>
Element in angeben ?my-resources
als den nachträglich fixierten Artefaktnamen einer vorübergehenden Abhängigkeit ?<jar-file/>
Wert des Elements und den Wert der tatsächlichen vorübergehenden Abhängigkeit synchronisieren ?Lösung
direkte (redundante?) Abhängigkeit und Ressourcenfilterung
Ich habe eine Eigenschaft und eine Abhängigkeit in
my-resources/pom.xml
.Bereiten Sie sich jetzt darauf vor
persistence.xml
, gefiltert zu werdenMaven Enforcer Plugin
Mit der
dependencyConvergence
Regel können wir sicherstellen, dass diemy-entities
Version sowohl direkt als auch transitiv gleich ist.quelle
Nicht unbedingt in allen Fällen.
Ich verwende Jboss 7.0.8 und Eclipselink 2.7.0. In meinem Fall, um Entitäten zu laden, ohne sie in persistence.xml hinzuzufügen, habe ich die folgende Systemeigenschaft in Jboss Standalone XML hinzugefügt:
<property name="eclipselink.archive.factory" value="org.jipijapa.eclipselink.JBossArchiveFactoryImpl"/>
quelle