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
Post a Comment