Esiste un modo per riutilizzare un jar con entità annotate JPA in più di un'applicazione SE (come dipendenza)? < jar-file > in persistence.xml non è supportato in ambienti SE, quindi esiste un altro modo?Scollega un oggetto JPA jar da persistence.xml nell'ambiente SE
risposta
ufficialmente (secondo la specifica), è necessario specificare tutte le classi che utilizzano l'elementoclass
. Citando la mappatura file capitolo 6.2.1.6, jar file, di classe, di escludere-classi non quotati del JSR-220:
un elenco di classi di persistenza gestita denominata può anche essere specificato al posto di, o in aggiunta a, i file JAR e i file di mapping. Qualsiasi annotazione di metadati di mappatura trovata su queste classi verrà elaborata, oppure verranno mappati utilizzando i valori di default delle annotazioni di mappatura. L'elemento
class
viene utilizzato per elencare una classe di persistenza gestita. Un elenco di tutte le classi di persistenza gestite con nome deve essere specificato negli ambienti Java SE per assicurare la portabilità. Le applicazioni Java SE portatili non devono fare affidamento sugli altri meccanismi descritti qui per specificare le classi di persistenza gestite di un'unità di persistenza. I fornitori di persistenza possono anche richiedere che l'insieme di classi e classi di entità che devono essere gestite debba essere completamente enumerato in ciascuno dei filepersistence.xml
in ambienti Java SE.
Ora, se non ti dispiace non essendo portatile, Hibernate supports utilizzando l'elemento jar-file
in Java SE (in questo caso è necessario un URL assoluto, non è a portata di mano). Hibernate supporta anche il rilevamento automatico anche in JSE. Molto meglio:
<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>
Per quanto ne so, non c'è modo di ottenere che la scansione della classe per le annotazioni funzioni in quella configurazione. Puoi comunque indicare esplicitamente il tuo file persistence.xml in ogni classe di entità.
<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>
Questo è stato un problema in cui mi sono imbattuto. Leggermente più prevenuto in quanto ho bisogno di eseguire diversi jar standalone e parte di uno schieramento di guerra.
Ci sono alcuni hack che sembrano girare attorno a più file persistence.xml e/o qualche strano tentativo di cercare di fare riferimento al file jar usando caricatori di risorse primaverili (che non funzionavano per me) .
Il mio attacco personale è usare caricatori di risorse primaverili per risolvere una risorsa che è in TUTTI i vasi di entità, analizzare il riferimento del vaso URL e usare un gestore di unità di persistenza Spring per iniettarli nel tag jar-file nel virtual persistence.xml
Questo è un modo approssimativo per farlo, ma evita di avere multiple persistence.xml - che è tecnicamente non valido.
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('!'));
}
e la roba contesto primavera:
<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>
si desidera filtrare i nomi jar idealmente però - 3 ° vaso partito potrebbe avere qualcosa a.
Dalla mia esperienza - Ora funziona.
Stiamo utilizzando: Hibernate3.jar 3.6.0.Final-1.0.0.Final.jar hibernate-APP-2.0-api
Il < jar-file> : ... </jar-file> sa come cercare i percorsi relativi - e funziona sia per i file jar che per le directory.
sto usando questa capacità due volte:
- con un vaso tenendo le entità - che viene utilizzato in diverse applicazioni. ogni app ha il proprio persistence.xml - principalmente per fornire diverse impostazioni ehcache.
- Con Junits quando voglio che tutti i miei test, in tutti gli altri progetti dipendenti abbiano un singolo file persistence.xml che punterà a tutte le entità nel progetto entità. Quindi manteniamo persistence.xml nel progetto Entities sotto test/resources/META-INF che punta alla directory Bin del progetto: < jar-file> file: ../ entity/bin </jar-file>
- 1. EclipseLink JPA - posizione di persistence.xml
- 2. Caricamento entità JPA da file Jar esterno
- 3. JPA persistence.xml META-INF non funziona correttamente
- 4. Dove mettere persistence.xml nel jar della libreria usando maven?
- 5. Condividi lo stesso JPA persistence.xml su più JAR EJB all'interno di EAR
- 6. Come "parametrizzare" l'istanza del database JPA in persistence.xml?
- 7. file jar per JPA 2.0
- 8. JPA - più jar che definiscono gli oggetti @Entity
- 9. Riferendosi all'oggetto del vaso di dipendenza di Maven da persistence.xml
- 10. persistence.xml con Glassfish 3.1.1
- 11. configurare Hibernate per utilizzare un persistence.xml rinominato
- 12. Esiste un modo per analizzare le entità JPA per non dichiarare le classi persistenti in un file persistence.xml?
- 13. caricamento .properties in spring-context.xml e persistence.xml
- 14. SQL Scollega più colonne Dati
- 15. possibile eliminare JAR JDO/JPA dal progetto GAE se si utilizza Twig/Objectify/etc?
- 16. Persistence.xml non configurato correttamente
- 17. Come posso unire/estendere unità di persistenza da diversi JAR?
- 18. Come creare un JAR da .java
- 19. JPA ottenere l'ID di oggetto entità
- 20. Scollega elemento selezionato Javascript o Jquery
- 21. Ottenere campo oggetto valore precedente hibernate JPA
- 22. Eclipse - Come correggere l'errore "Nessun file persistence.xml trovato nel progetto" JPA issue
- 23. Il pool di connessioni C3p0 per jpa in persistence.xml non funziona?
- 24. JPA con TopLink: No META-INF/persistence.xml è stato trovato nel percorso di classe
- 25. Verificare se è un oggetto
- 26. Verifica se esiste un oggetto
- 27. Esegui file .jar da un programma Java
- 28. Come proteggere un file Jar da decompilare?
- 29. Come creare un file jar da scala
- 30. ant per rimuovere file da un jar