27的WAR文件中工作

27的WAR文件中工作

本文介绍了JPA实体作为可共享的jar无法在Tomcat 7.0.27的WAR文件中工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在Eclipse Juno的JPA 2.0项目中共享我的实体,因为我正在创建一个测试项目,因此我需要访问那里进行测试,如果我创建了其他项目,则可以重用这些实体

i tried to share my entities in a JPA 2.0 project in eclipse Juno, ´cause i´m creating a test project and i need to access then there to make my tests and if i create any other project a can reuse those entities.

最大的问题是休眠(4.1.9)可以在相对路径中找到我的jar,但是最奇怪的是,在仅使用Spring 3休眠的测试项目中,我完美地读取了我的实体jar和hbm文件.但是,当我尝试使用tomcat 7.0.27对实际项目执行相同操作时,它可以在jar所在的位置进行语言环境设置,我的真实项目是tomcat和Spring 3中的常见WAR文件.这是我的真实项目的persistence.xml:

The biggest problem is that hibernate ( 4.1.9 ) can find my jar in a relative path, but the most strange is that in my test project using only Spring 3 hibernate read my entities jar and hbm files perfectly. But when i try to do the same with the real project using tomcat 7.0.27 it can locale where the jar is, my real project is a common WAR file in tomcat and with Spring 3. Here is my persistence.xml of real project:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
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_2_0.xsd">
<persistence-unit name="CustomerServiceMacrosUnit"
    transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <!-- the JNDI data source -->
    <non-jta-data-source>java:comp/env/jdbc/CustomerServiceMacrosDS</non-jta-data-source>

    <jar-file>../lib/aliancaModel.jar</jar-file>

    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

这是我映射所有类的jar持久性:

And here is my jar persistence with all classes mapped:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
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_2_0.xsd">
<persistence-unit name="AliancaJPA">
       <class>br.com.alianca.customerservicemacros.entity.controlefaturas.DocsysBl</class>
       <class>br.com.alianca.customerservicemacros.entity.controlefaturas.DocsysBooking</class>
      <class>br.com.alianca.customerservicemacros.entity.controlefaturas.DocsysCharge</class>
       <class>br.com.alianca.customerservicemacros.entity.controlefaturas.DocsysContainer</class>

</persistence-unit>

这是tomcat日志中的错误:

Here is the error from tomcat´s log:

INFO: Initializing Spring root WebApplicationContext
28/03/13 12:00  INFO org.hibernate.annotations.common.Version:37
HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
28/03/13 12:00  INFO org.hibernate.Version:41
HHH000412: Hibernate Core {4.1.9.Final}
28/03/13 12:00  INFO org.hibernate.cfg.Environment:239
HHH000206: hibernate.properties not found
28/03/13 12:00  INFO org.hibernate.cfg.Environment:342
HHH000021: Bytecode provider name : javassist
28/03/13 12:01  WARN org.hibernate.ejb.packaging.FileZippedJarVisitor:74
HHH015010: Unable to find file (ignored): file:../lib/aliancaModel.jar
java.io.FileNotFoundException: ..\lib\aliancaModel.jar (The system cannot find the path specified)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:127)
at java.util.jar.JarFile.<init>(JarFile.java:135)
at java.util.jar.JarFile.<init>(JarFile.java:72)
at org.hibernate.ejb.packaging.FileZippedJarVisitor.doProcessElements(FileZippedJarVisitor.java:70)
at org.hibernate.ejb.packaging.AbstractJarVisitor.getMatchingEntries(AbstractJarVisitor.java:149)
at org.hibernate.ejb.packaging.NativeScanner.getClassesInJar(NativeScanner.java:128)
at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:485)
at org.hibernate.ejb.Ejb3Configuration.addMetadataFromScan(Ejb3Configuration.java:475)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:371)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
at org.springframework.orm.jpa.LocalEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalEntityManagerFactoryBean.java:92)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1525)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1463)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.orm.jpa.EntityManagerFactoryUtils.findEntityManagerFactory(EntityManagerFactoryUtils.java:99)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findNamedEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:512)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:494)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:659)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:630)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:155)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:92)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:340)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1117)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:605)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1566)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1556)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

使用调试,我可以强制休眠在文件系统中使用完整路径对jar进行本地化,但是即使使用该资源,它也找不到我的hbms!

Using the debug, i could force hibernate to locale the jar with full path in my filesystem, but even using the resource it couldn´t find my hbms!

我开始认为它只能与EAR文件一起使用! :(有人可以说点什么吗?

I starting to think that it can only work wit EAR files! :(Can someone give some point?

推荐答案

最后,我弄清楚了如何解决这个问题!

finally i figure out how to manage this problem!

我不知道为什么,但是如果您使用"LocalContainerEntityManagerFactoryBean",它可以正确找到并读取实体的jar,因此我必须像这样更改我的spring配置:

I don´t known why, but if you use "LocalContainerEntityManagerFactoryBean", it can find and read the entities´s jar properly, so i had to change my spring configuration like this:

之前:

<bean id="emfCustomerServiceMacros" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="CustomerServiceMacrosUnit" />
</bean>

现在,通过这种方式,spring和hibernate可以找到jar了:

Now with this approach spring and hibernate can find the jar:

<bean id="emfCustomerServiceMacros" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
</bean>

现在,如果hibernate找不到jar,它将在日志中向您显示其到库所在位置的完整路径,在我的情况下,我将Web应用程序的persistence.xml更正为:

Now if hibernate can´t find the jar, it will show you a full path in the log to where it was spectating for the library, in my case i corrected my web application´s persistence.xml to:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd">
<persistence-unit name="CustomerServiceMacrosUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- the JNDI data source -->
<non-jta-data-source>java:comp/env/jdbc/CustomerServiceMacrosDS</non-jta-data-source>

<jar-file>lib/AliancaModel.jar</jar-file>

我将检查Spring的源代码,看看为什么会发生这种情况!

I´ll check the Spring´s source code and see why that happens!

这篇关于JPA实体作为可共享的jar无法在Tomcat 7.0.27的WAR文件中工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-26 13:15