java - Spring, JPA, Hibernate, Tomcat: Unable to find persistence unit when loading Spring application context -


i have application context trying setup jpa:

application-context.xml:

<bean class="org.springframework.orm.jpa.support.persistenceannotationbeanpostprocessor">     <property name="persistenceunits">         <map>             <entry key="pu1" value="pu1" />             <entry key="pu2" value="pu2" />         </map>     </property>     <property name="defaultpersistenceunitname" value="pu1" /> </bean>  <bean id="emf1" class="org.springframework.orm.jpa.localcontainerentitymanagerfactorybean">     <property name="jpavendoradapter">         <bean class="org.springframework.orm.jpa.vendor.hibernatejpavendoradapter">             <property name="showsql" value="true" />             <property name="generateddl" value="false" />             <property name="databaseplatform" value="org.hibernate.dialect.mysqldialect" />         </bean>     </property>     <property name="persistenceunitname" value="pu1" />     <property name="datasource" ref="datasource1" /> </bean>  <bean id="emf2" class="org.springframework.orm.jpa.localcontainerentitymanagerfactorybean">     <property name="jpavendoradapter">         <bean class="org.springframework.orm.jpa.vendor.hibernatejpavendoradapter">             <property name="showsql" value="true" />             <property name="generateddl" value="false" />             <property name="databaseplatform" value="org.hibernate.dialect.sqlserver2005dialect" />         </bean>     </property>     <property name="persistenceunitname" value="pu2" />     <property name="datasource" ref="datasource2" /> </bean>  <!-- enable annotation style of managing transactions --> <tx:annotation-driven />  <bean id="transactionmanager1" class="org.springframework.orm.jpa.jpatransactionmanager">     <property name="entitymanagerfactory" ref="emf1" />     <property name="datasource" ref="datasource1" /> </bean>  <bean id="transactionmanager2" class="org.springframework.orm.jpa.jpatransactionmanager">     <property name="entitymanagerfactory" ref="emf2" />     <property name="datasource" ref="datasource2" /> </bean>  <bean class="org.springframework.beans.factory.config.propertyplaceholderconfigurer">     <property name="locations">         <list>             <value>classpath:config/db/database.properties</value>         </list>     </property>     <property name="ignoreunresolvableplaceholders" value="true" />     <property name="ignoreresourcenotfound" value="true" />     <property name="systempropertiesmodename" value="system_properties_mode_override"/>   </bean>  <!-- actual config of database read properties file database.properties --> <bean id="datasource1" class="com.mchange.v2.c3p0.combopooleddatasource" destroy-method="close"     p:acquireincrement="5" p:idleconnectiontestperiod="14400" p:maxpoolsize="50" p:maxstatements="15"     p:minpoolsize="5" p:testconnectiononcheckout="true" p:preferredtestquery="select 4;"     p:driverclass="${db.system1.driver}" p:jdbcurl="${db.system1.url}" p:user="${db.system1.user}" p:password="${db.system1.password}" />  <bean id="datasource2" class="com.mchange.v2.c3p0.combopooleddatasource" destroy-method="close" p:acquireincrement="5" p:idleconnectiontestperiod="60" p:maxpoolsize="10"     p:maxstatements="50" p:minpoolsize="3" p:testconnectiononcheckout="true" p:preferredtestquery="select 4;"     p:driverclass="${db.system2.driver}" p:jdbcurl="${db.system2.url}" p:user="${db.system2.user}" p:password="${db.system2.password}" />  <context:annotation-config /> <context:component-scan base-package="com.myapp.model.manager"/> 

persistence.xml:

<persistence-unit name="pu1" transaction-type="resource_local">     <provider>org.hibernate.ejb.hibernatepersistence</provider>     <class>com.myapp.model.address</class>     <class>com.myapp.model.agressofile</class>     <class>com.myapp.model.customergroup</class>     ... </persistence-unit>  <persistence-unit name="pu2" transaction-type="resource_local">     <provider>org.hibernate.ejb.hibernatepersistence</provider>     <class>com.myapp.model.competencearea</class>     <class>com.myapp.model.competenceareacategory</class>     ... </persistence-unit> 

i loading application context in web.xml way:

<context-param>     <param-name>contextconfiglocation</param-name>     <param-value>         /web-inf/spring/application-context.xml     </param-value> </context-param>  <listener>     <listener-class>org.springframework.web.context.contextloaderlistener</listener-class> </listener> 

competenceareamanager class locates in scanned package "com.myapp.model.manager" has following content:

@service public class competenceareamanager {      @persistenceunit(unitname = "pu2")     private entitymanagerfactory entitymanagerfactory;      @suppresswarnings("unchecked")     public list<competencearea> getcompetenceareas() {         list<competencearea> competencearealist = null;         entitymanager em = entitymanagerfactory.createentitymanager();         query q = em.createnamedquery(competencearea.find_all);         competencearealist = q.getresultlist();         return competencearealist;     }      public void setentitymanagerfactory(entitymanagerfactory entitymanagerfactory) {         this.entitymanagerfactory = entitymanagerfactory;     } } 

however, when try run application in tomcat 7.0, following error:

severe: exception sending context initialized event listener instance of class org.springframework.web.context.contextloaderlistener org.springframework.beans.factory.beancreationexception: error creating bean name 'competenceareamanager': injection of persistence dependencies failed; nested exception java.lang.illegalstateexception: not obtain entitymanagerfactory [pu2] jndi     @ org.springframework.orm.jpa.support.persistenceannotationbeanpostprocessor.postprocesspropertyvalues(persistenceannotationbeanpostprocessor.java:343)     @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.populatebean(abstractautowirecapablebeanfactory.java:1122)     @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.docreatebean(abstractautowirecapablebeanfactory.java:522)     @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbean(abstractautowirecapablebeanfactory.java:461)     @ org.springframework.beans.factory.support.abstractbeanfactory$1.getobject(abstractbeanfactory.java:295)     ... caused by: java.lang.illegalstateexception: not obtain entitymanagerfactory [pu2] jndi     @ org.springframework.orm.jpa.support.persistenceannotationbeanpostprocessor.getpersistenceunit(persistenceannotationbeanpostprocessor.java:435)     @ org.springframework.orm.jpa.support.persistenceannotationbeanpostprocessor$persistenceelement.resolveentitymanagerfactory(persistenceannotationbeanpostprocessor.java:643)     @ org.springframework.orm.jpa.support.persistenceannotationbeanpostprocessor$persistenceelement.getresourcetoinject(persistenceannotationbeanpostprocessor.java:637)     @ org.springframework.beans.factory.annotation.injectionmetadata$injectedelement.inject(injectionmetadata.java:150)     @ org.springframework.beans.factory.annotation.injectionmetadata.inject(injectionmetadata.java:87)     ... caused by: javax.naming.namenotfoundexception: name [pu2] not bound in context. unable find [pu2].     @ org.apache.naming.namingcontext.lookup(namingcontext.java:820)     @ org.apache.naming.namingcontext.lookup(namingcontext.java:168)     @ org.apache.naming.selectorcontext.lookup(selectorcontext.java:158)     @ javax.naming.initialcontext.lookup(unknown source)     @ org.springframework.jndi.jnditemplate$1.doincontext(jnditemplate.java:154)     ... 

any idea i'm doing wrong?

if configure persistenceannotationbeanpostprocessor persistenceunits, informing persistenceannotationbeanpostprocessor pus come jndi (as javadoc setpersistenceunits() methods mentions it). stack trace shows failing jndi lookup.

since using <context:annotation-config/> in application-context.xml, don't need declare persistenceannotationbeanpostprocessor, because 1 automatically registered, looks pus reading meta-inf/persistence.xml files located in classpath, expect.

your configuration should simple :

persistence.xml remains unchanged

competenceareamanager

as sergey makarov mentions it, inject entitymanager @persistencecontext instead of injecting entitymanagerfactory @persistenceunit. em transactional (thus bound thread, ensuring thread-safety dao), , can still configure @persistencecontext unitname in order specify pu em has bound to.

application-context.xml

just drop declaration of persistenceannotationbeanpostprocessor bean. rest of file remains unchanged.

i haven't tried particular config (2 pus), configuration mention 1 have been using, success.


Comments