2010-04-12 11 views

Antwort

6

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

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

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.

2

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>
Verwandte Themen