2010-04-12 33 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>