2010-04-12 21 views

risposta

6

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 file persistence.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> 
2

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> 
1

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.

2

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>
Problemi correlati