2010-04-12 31 views

回答

6

正式(按規格),你必須指定使用class元素所有類。引述章6.2.1.6映射文件,JAR文件,類,排除,非流通類的JSR-220

也可以代替指定的命名管理的持久化類的列表,或另外到JAR文件和映射文件。在這些類上找到的任何映射元數據註釋都將被處理,或者它們將使用映射註釋默認值進行映射。 class元素用於列出託管的持久性類。 必須在Java SE環境中指定所有命名託管持久性類的列表以確保可移植性。可移植Java SE應用程序不應該依賴此處描述的其他機制來指定持久性單元的託管持久性類。持久性提供者還可能要求在Java SE環境中的每個persistence.xml文件中都必須完全枚舉要管理的實體類和類集。

現在,如果你不介意不攜帶,使用jar-file元素在Java SE休眠supports(在這種情況下是必要的,不能得心應手絕對URL)。即使在JSE中,Hibernate實際上也支持自動檢測。好多了:

<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

據我所知,沒有辦法讓類別掃描註釋在該配置中工作。但是,您可以明確地將您的persistence.xml文件指向每個實體類。

<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

這是我碰到的一個問題。稍微偏向正面,因爲我需要單獨運行幾個jar以及部署戰爭部署。

這裏有一些似乎圍繞着多個persistence.xml文件和/或一些奇怪的嘗試嘗試引用使用spring資源加載器的jar文件(這對我來說並不起作用) 。

我的個人黑客攻擊是使用spring資源加載器來解析所有實體罐子中的資源,解析出URL jar引用並使用Spring持久性單元管理器將這些注入到虛擬的jar文件標籤中persistence.xml

這是一個完整的方法,但避免使用多個persistence.xml - 這在技術上是無效的。

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('!')); 
} 

和Spring上下文的東西:

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

你要理想,雖然過濾罐的名字 - 第三方JAR可能在任何東西。

2

從我的經驗 - 它現在的作品。

我們使用: hibernate3.jar裏3.6.0.Final 的Hibernate JPA-2.0-API 1.0.0.Final.jar

< JAR文件>文件:... </jar-file>知道如何查找相對路徑 - 它對jar文件或目錄都有效。

我使用這個能力兩次:

  • 與JAR抱着我的實體 - 這是在幾個應用程序中使用。每個應用都有它自己的persistence.xml - 主要是爲了提供不同的ehcache設置。
  • 對於Junits,當我想要所有測試時,在所有其他依賴項目中都有一個persistence.xml文件,該文件將指向實體項目中的所有實體。然後我們將persistence.xml保存在test/resources/META-INF下的實體項目中,指向該項目的Bin目錄: < jar-file> file:../ entities/bin </jar-file>