Gibt es eine Möglichkeit, einen Jar mit JPA-Annotationen in mehr als einer SE-Anwendung (als Abhängigkeit) wiederzuverwenden? < jar-file > in persistence.xml wird in SE-Umgebungen nicht unterstützt, gibt es also einen anderen Weg?Entkoppeln eines JPA-Entities-Krugs aus persistence.xml in SE-Umgebung
Antwort
Offiziell (pro-Spezifikation), müssen Sie alle Klassen angeben mit dem class
Element. Unter Angabe der Kapitel 6.2.1.6 Mapping-Datei, jar-Datei, Klasse, auszuschließen-nicht angegeben Klassen der JSR-220:
Eine Liste mit dem Namen Managed Persistence Klassen auch statt angegeben werden kann, oder zusätzlich zu, die JAR-Dateien und Mapping-Dateien. Alle Mapping-Metadaten-Annotationen, die für diese Klassen gefunden wurden, werden verarbeitet, oder sie werden mithilfe der Mapping-Annotation-Standardwerte zugeordnet. Das Element
class
wird zum Auflisten einer verwalteten Persistenzklasse verwendet. In Java SE-Umgebungen muss eine Liste aller benannten verwalteten Persistenzklassen angegeben werden, um die Portabilität zu gewährleisten. Portable Java SE-Anwendungen sollten sich nicht auf die anderen hier beschriebenen Mechanismen verlassen, um die verwalteten Persistenzklassen einer Persistenzeinheit anzugeben. Persistenzprovider erfordern möglicherweise auch, dass der Satz von Entitätsklassen und Klassen, die verwaltet werden sollen, in jeder derpersistence.xml
-Dateien in Java SE-Umgebungen vollständig aufgelistet werden muss. Jetzt
, wenn Sie nichts dagegen nicht tragbar, Hibernate supports mit dem jar-file
Elemente in Java SE (in diesem Fall eine absolute URL benötigt wird, nicht zur Hand). Hibernate unterstützt die automatische Erkennung auch in JSE. Viel besser:
<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="foo">
<!-- This is required to be spec compliant, Hibernate however supports auto-detection even in JSE. -->
<class>foo.Bar<class>
<properties>
<!-- Scan for annotated classes and Hibernate mapping XML files -->
<property name="hibernate.archive.autodetection" value="class, hbm"/>
...
</properties>
</persistence-unit>
</persistence>
Soweit ich weiß, gibt es keine Möglichkeit, die Klassensuche nach Anmerkungen in dieser Konfiguration arbeiten zu lassen. Sie können jedoch Ihre persistence.xml-Datei explizit auf jede Entitätsklasse verweisen.
<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="punit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/myDS</jta-data-source>
<!-- Must be explicit as classes are in separate jar -->
<class>com.foo.Bar</class>
<class>com.foo.Baz</class>
<properties/>
</persistence-unit>
</persistence>
Dies war ein Problem, das ich lief. Etwas preverser, da ich mehrere Jar Standalone sowie Teil einer War-Bereitstellung ausführen muss.
Es gibt ein paar Hacks da draußen, die sich entweder um mehrere persistence.xml-Dateien drehen und/oder einige seltsam aussehende Versuche, die jar-Datei mithilfe von Spring Resource Loadern zu referenzieren (was bei mir nicht funktionierte) .
Mein persönlicher Hack ist die Verwendung von Spring Resource Loadern zum Auflösen einer Ressource in ALLEN Entity-Jars, Auswerten der URL-Jar-Referenz und Verwenden eines Spring-Persistenz-Unit-Managers, um diese in das JAR-File-Tag im virtuellen zu injizieren persistence.xml
Dies ist eine ungefähre Art und Weise, es zu tun, aber vermeidet mehrere persistence.xml - was technisch ungültig ist.
public class SpringPersistenceUnitManager extends DefaultPersistenceUnitManager implements ApplicationContextAware {
private final Logger log = LoggerFactory.getLogger(getClass());
private ApplicationContext ctx = null;
private String jarLocationPattern;
@Override
protected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {
super.postProcessPersistenceUnitInfo(pui);
try {
Resource[] resources = ctx.getResources("classpath*:applicationContext.xml");
for (Resource res : resources) {
String resJar = resolveJar(res.getURL());
if (!resJar.equals(pui.getPersistenceUnitRootUrl().toString())) {
log.info("Adding " + resJar + " to persistence context");
pui.addJarFileUrl(new URL(resJar));
}
}
}
catch (IOException e) {
log.error("error", e);
}
}
private String resolveJar(URL fileInJar) {
String path = fileInJar.getPath();
return path.substring(0, path.indexOf('!'));
}
und die Feder Kontext Zeug:
<util:properties id="hibernate.properties" location="classpath:hibernate.properties" />
<bean id="persistenceUnitManager" class="com.rokksoft.blackice.util.SpringPersistenceUnitManager"
p:defaultDataSource-ref="jdbcDataSourcePool"
/>
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" lazy-init="true"
p:persistenceUnitManager-ref="persistenceUnitManager"
p:persistenceUnitName="blackicePU"
p:dataSource-ref="jdbcDataSourcePool"
p:jpaProperties-ref="hibernate.properties">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
</bean>
Sie wollen ideal, obwohl die jar Namen filtern - 3rd-Party-Glas etwas in haben könnte.
Aus meiner Erfahrung - Es funktioniert jetzt.
Wir verwenden: hibernate3.jar 3.6.0.Final Hibernate-JPA-2.0-api-1.0.0.Final.jar
Die < jar-Datei> Datei: ... </jar-file> weiß, wie man nach relativen Pfaden sucht - und es funktioniert sowohl für JAR-Dateien als auch für Verzeichnisse.
Ich benutze diese Fähigkeit zweimal:
- mit einem Jar meine Einheiten halten - die in mehreren Anwendungen verwendet wird. Jede App hat ihre eigene persistence.xml - hauptsächlich, um verschiedene Einstellungen für den EHC zu ermöglichen.
- Mit Junits möchte ich alle meine Tests, in allen anderen abhängigen Projekten eine einzige Datei persistence.xml, die auf alle Entitäten in den Entitäten Projekt zeigen. Dann behalten wir die Datei persistence.xml im Entities-Projekt unter test/resources/META-INF, die auf das Bin-Verzeichnis dieses Projekts zeigt: < jar-file> Datei: ../ entities/bin </jar-Datei>
- 1. Persistence.xml Feldwerte aus der Eigenschaftendatei
- 2. Hibernate Illegal persistence.xml nicht vorhanden ist - Unit-Test ohne persistence.xml
- 3. Lumen Laravel entkoppeln Geschäftslogik
- 4. Mehrere Kopien eines datengebundenen Objekts aus einer DataGridView erstellen - wie entkoppeln?
- 5. Persistence.xml und OSGi (Equinox)
- 6. Persistence.xml nicht richtig konfiguriert
- 7. Wie springConfiguration.xml persistence.xml erkennt
- 8. Wir verweisen auf die artifactId eines maven-Abhängigkeits-jars aus persistence.xml
- 9. Wie "parameterize" JPA-Datenbankinstanz in persistence.xml?
- 10. Bezug Tomcat JNDI-Datenquelle in persistence.xml
- 11. JPA persistence.xml ist nicht geladen
- 12. Ist der JPA-Klassenpfad "persistence.xml" vorhanden?
- 13. persistence.xml nicht gefunden während Maven-Test
- 14. entkoppeln die Bildschirm ohne Magie Saiten
- 15. Entkoppeln von React-Komponenten und Redux Connect
- 16. Linking/Entkoppeln jquery Objekt zu einem Element
- 17. Entkoppeln von SQL-Dateien und API-Modellen
- 18. npm installieren Fehler geben: EPERM, entkoppeln
- 19. Wie entkoppeln Sie Logging-Implementierung und API?
- 20. Wie JavaScript-Programmierung von Frameworks zu entkoppeln?
- 21. Ist es möglich, die Code-Indizierungsfunktionen von Eclipse zu entkoppeln?
- 22. JPA 2.0, Hibernate 3.5, Gläser & Persistence.xml Speicherort
- 23. entkoppeln mehr Dateien in einem C-Linux-Programm
- 24. Laden von .properties in spring-context.xml und persistence.xml
- 25. Wie ändere ich persistence.xml zur Laufzeit
- 26. C3p0 Verbindungspooling für jpa in persistence.xml funktioniert nicht?
- 27. JPA persistence.xml, Definieren einer postgresql JTA-Datenquelle
- 28. Entkoppeln Navigation und Auswahl mit JSF tree-like-Widget
- 29. So entkoppeln Sie Bluetooth-Gerät mit Android 2.1 sdk
- 30. kann ich Werte in die Datei persistence.xml von Maven injizieren?