有沒有一種方法可以在多個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未加載