Results 1 to 3 of 3

Thread: greenpages and hibernate criteria

  1. #1

    Default greenpages and hibernate criteria

    Hello

    I am new to spring-dm server and osgi. I want to use hibernate criteria api for accessing the db. I am playing with greenpages and I modified its jpa-solution bundle to use hibernate instead of eclipse-link.

    The problem is that Session is closed exception is raised after querying http://localhost:8080/greenpages/app/search.htm?query=rod.

    I've tried to change the transaction management, i used compile-time weaving, tried to change transaction mode into proxy, finally i did my own debugging and discovered that session is closed because entity manager is closed.

    Except entityManager.getSession().createCriteria(), calls like entityManager.find(...) work.

    What's wrong?

    Changed files are attached. To apply my changes just override files in the greenpages-2.0.0.RELEASE directory with files from the zip.

    Stack trace:
    Code:
    org.hibernate.SessionException: Session is closed!
    	org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
    	org.hibernate.impl.SessionImpl.createCriteria(SessionImpl.java:1508)
    	greenpages.jpa.JpaDirectory.search(JpaDirectory.java:62)
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	java.lang.reflect.Method.invoke(Method.java:597)
    	org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    	org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:58)
    	org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:62)
    	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    	org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
    	org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
    	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    	org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:56)
    	org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:39)
    	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    	org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)
    	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    	org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
    	org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
    	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    	org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    	$Proxy149.search(Unknown Source)
    	greenpages.web.GreenPagesController.search(GreenPagesController.java:58)
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	java.lang.reflect.Method.invoke(Method.java:597)
    	org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:632)
    	org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:150)
    	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:360)
    	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:348)
    	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:763)
    	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:709)
    	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:614)
    	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:526)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    spring-module.xml (ommited header)
    Code:
    <!-- JPA EntityManagerFactory -->
    	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:dataSource-ref="dataSource">
    		<property name="jpaVendorAdapter">
    			<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    					p:databasePlatform="org.hibernate.dialect.H2Dialect" p:showSql="true"/>
    		</property>
    	</bean>
    
    	<!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA) -->
    	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    			p:entityManagerFactory-ref="entityManagerFactory"/>
    
    
    	<!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
    
    	<!--
    		Activates various annotations to be detected in bean classes: Spring's
    		@Required and @Autowired, as well as JSR 250's @PostConstruct,
    		@PreDestroy and @Resource (if available) and JPA's @PersistenceContext
    		and @PersistenceUnit (if available).
    	-->
    	<context:annotation-config/>
    
    	<!--
    		Instruct Spring to perform declarative transaction management
    		automatically on annotated classes.
    	-->
    	<tx:annotation-driven mode="aspectj"/>
    
    	<!--
    		Post-processor to perform exception translation on @Repository classes (from native
    		exceptions such as JPA PersistenceExceptions to Spring's DataAccessException hierarchy).
    	-->
    	<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
    
    	<!--
    		Will automatically be transactional due to @Transactional.
    		EntityManager will be auto-injected due to @PersistenceContext.
    		PersistenceExceptions will be auto-translated due to @Repository.
    	-->
    	<bean id="directory" class="greenpages.jpa.JpaDirectory"/>
    template.mf
    Code:
    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: GreenPages JPA
    Bundle-SymbolicName: greenpages.jpa
    Bundle-Vendor: SpringSource Inc.
    Bundle-Version: 2.0
    Import-Template: 
     org.springframework.*;version="[3.0, 3.1)",
     greenpages;version="[2.0, 2.1)",
     javax.persistence;version="[1.0.0, 1.0.0]",
     org.apache.commons.dbcp.*;version="[1.2.2.osgi, 1.2.2.osgi]",
     javax.sql;version="0",
     org.hibernate.*;version="[3.2, 3.5)"
    Import-Package: 
     org.springframework.context.weaving;version="[3.0, 3.1)",
     org.springframework.transaction.aspectj;version="[3.0, 3.1)"
    Excluded-Exports: 
     greenpages.jpa
    Excluded-Imports: 
     org.springframework.test.*,
     org.junit.*
    Import-Library: org.hibernate.ejb;version="[3.3.2.GA,3.3.2.GA]"
    JpaDirectory.java
    Code:
    @Transactional
    @Repository
    final class JpaDirectory implements Directory {
    
        private static final String SEARCH_QUERY = "select l from Listing l where upper(l.lastName) like :term";
    
        /**
         * Spring will inject a managed JPA {@link EntityManager} into this field.
         */
        @PersistenceContext
        private HibernateEntityManager em;
    
        public Listing findListing(int id) {
            return em.find(JpaListing.class, id);
        }
    
        @SuppressWarnings("unchecked")
        public List<Listing> search(String term) {
        	Session session = em.getSession();
        	Criteria crit = session.createCriteria(JpaListing.class); //Session is closed! exception
        	crit.add(Restrictions.like("lastName", term));
        	return crit.list();
    //        return em.createQuery(SEARCH_QUERY).setParameter("term", "%" + term.toUpperCase() + "%").getResultList();
        }
    
    }
    Dependency to org.hibernate.ejb-library was added into pom.xml.
    Attached Files Attached Files

  2. #2
    Join Date
    Oct 2008
    Posts
    493

    Default

    Thanks for the problem report. I'd recommend taking a look at the Hibernate flavour of the Petclinic sample to see if there's anything obviously different between its configuration and the configuration in your application. If that doesn't shed any light on the problem then let us know.
    Andy Wilkinson
    SpringSource

  3. #3
    Join Date
    Jul 2007
    Posts
    101

    Default

    It looks like the @Transactional is not being applied. When I configured annotated transactions like that, I would use

    <tx:annotation-driven transaction-manager="transactionManager"/>

    Also, you may want to try placing @Transactional on the method not class.

    Also, standard proxies can't deal with final classes. Hibernate has all kinds of issues with them.

    Hope one of these suggestions helps you find your solution.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •