有没有一种方法可以在多个SE应用程序(作为依赖项)中重复使用具有JPA批注实体的jar? <在SE环境中不支持persistence.xml中的jar文件>所以还有其他方法吗?在SE环境中从persistence.xml中解耦JPA实体jar
回答
正式(按规格),你必须指定使用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>
据我所知,没有办法让类别扫描注释在该配置中工作。但是,您可以明确地将您的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>
这是我碰到的一个问题。稍微偏向正面,因为我需要单独运行几个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可能在任何东西。
从我的经验 - 它现在的作品。
我们使用: 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>
- 1. Java SE环境中的JPA:在persistence.xml中加载的实体类没有defenition
- 2. persistence.xml中的环境变量扩展(JPA)
- 3. 从Rails环境中解耦服务类
- 4. 将环境变量注入JPA实体
- 5. GAE上JPA的persistence.xml实体类
- 6. 依赖jar中的JPA实体
- 7. AutoMapper解耦域从实体和更远
- 8. JPA persistence.xml共享相同的jar文件
- 9. JPA persistence.xml
- 10. 从JPA实体
- 11. 事务和JPA/persistence.xml中
- 12. JPA persistence.xml SE应用程序的数据源
- 13. 在环境之间移动带注释的jpa实体
- 14. JPA without persistence.xml
- 15. postgresql + jpa + persistence.xml
- 16. Spring JPA和persistence.xml
- 17. JPA @PrePersist在测试环境中
- 18. JPA 2.1在JPA EntityListener中创建实体
- 19. Hibernate的JPA如何配置在persistence.xml中
- 20. 在几个项目中共享JPA persistence.xml
- 21. 在Eclipse的persistence.xml中设置环境变量值
- 22. 在非xml环境中针对linq的通用键值访问解耦
- 23. 在OSX中将Java SE 6设置为执行环境Eclipse
- 24. 如何在java SE环境中运行Java Batch(JSR352)?
- 25. 如何在Java SE环境中部署JAX-RS应用程序?
- 26. 是否可以在Java SE环境中使用javax.interceptor?
- 27. JPA persistence.xml找不到
- 28. JPA persistence.xml添加类
- 29. JPA - 无效的persistence.xml
- 30. JPA persistence.xml未加载