Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Spring: Attempting to execute an operation on a closed EntityManager.

Thanks Shaun,
I've completely given up on tomcat at this point, I'll be in an OC4J
environment in production anyway.

The problem I'm running into now  is there are about 4,000 ways to use
JPA in Spring:

I can get things to work if I use their JpaDaoSupport class, however I
would prefer a more "pure" method....which just happened to FINALLY
work as I typed this, that method was using the @PersistenceContext
annotation to inject an EntityManager.

Unfortunately, now that it works I have no idea why :) I do see now
that AspectJ is reporting it's doing stuff, so I think my problems
before might have been with weaving on some level.

I think part of the problems I was dealing with was two-fold: My Lack
of any real understanding on the Spring Framework and lack of any real
examples.

Once I take the time now to analyze what's going on I'll try to remedy
the latter.

If anyone can impart some best practices for using Eclipselink with
Spring 2.5 I'd be all ears in the mean time.

./tch



On Fri, Sep 26, 2008 at 11:24 AM, Shaun Smith <shaun.smith@xxxxxxxxxx> wrote:
> Hi Tim,
>
>    If you're using Spring with EclipseLink you must copy
> spring-tomcat-weaver.jar into $CATALINA_HOME/server/lib see the Spring
> Manual for details.  Tomcat absolutely will not support dynamic weaving in
> Spring (or anything else for that matter) unless you use a technique like
> this.  You didn't mention you did this so don't think you did.  Once you
> have this in place and you've setup your Spring config properly, Spring will
> do @PersistenceContext injection.  Take a look at the TopLink Essentials JPA
> version of the Spring PetClinic for an example.
>
>     Shaun
>
> Tim Hollosy wrote:
>
> So no luck em.isOpen returns true.
>
> I can't get my friggin AspectJ Weaver to output anything even though I
> have an aop.xml like this:
>
> <!DOCTYPE aspectj PUBLIC
> "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd";>
> <aspectj>
>     <weaver options="-debug -verbose -showWeaveInfo
> -XmessageHandlerClass:org.springframework.aop.aspectj.AspectJWeaverMessageHandler">
>         <include within="com.redacted.*"/>
>     </weaver>
>      <aspects>
>         <aspect
> name="org.springframework.transaction.aspectj.AnnotationTransactionAspect"/>
>     </aspects>
> </aspectj>
>
>
> BUT, doing some more reading about weaving I see: at
> http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#Limitations_to_JPA
>
> As Tomcat is not a JEE5 compatible server, there are some limitiations to
> JPA.
>
>     * No dynamic weaving (instrumentation) - static weaving of
> entities is still available via EclipseLink
>     * No @EJB injection of a session bean (containing the
> EntityManager) is available - use the persistence factory and manager
> directly
>     * No @PersistenceContext injection of a container managed
> persistence unit is available - use
> Persistence.createEntityManagerFactory(JTA_PU_NAME)
>
>
> Does that mean i can't use the @PersistenceContext annotation with
> EclipseLink in Tomcat 6???
>
> I'm confused as to weather Tomcat 6 supports LTW or not, since there
> are instructions all over for getting it to weave with Spring...
>
> I may set up an OC4J Instance and see if I have better luck, but right
> now I'm confused as all get out.
>
> ./tch
>
>
>
> On Fri, Sep 26, 2008 at 6:58 AM, Tim Hollosy <hollosyt@xxxxxxxxx> wrote:
>
>
> Mohsen,
> I didn't actually call isOpen, I instead inspected it with the
> debugger, and noticed the isOpen boolean was true. I'll try your
> obvious suggestion when I get in to the office this morning.
>
> My hunch is something odd is going on with weaving, so I'm going to
> put some weaving logging in as well.
>
>
> I guess this is just growing pains and it doesn't always help when I
> choose bleeding edge -- pure annotations & eclipselink for my first
> foray into Spring -- but I just can't stand XML, so I've made my bed
> :)
>
> Thanks
>
> ./tch
>
>
>
> On Fri, Sep 26, 2008 at 6:54 AM, Mohsen Saboorian <mohsens@xxxxxxxxx> wrote:
>
>
> I didn't test it with EclipseLink, but with Hibernate session is
> closed after transaction is committed, and it produces a lot of
> frustrations with lazy loading, since you usually need to fetch a list
> after a transaction is committed.
>
> Spring provides a OpenSessionInViewFilter to work around this. It
> keeps session open durig a request life-cycle.
>
> How did you verified that EM is open? EM.isOpen()?
>
> Mohsen.
>
> On Thu, Sep 25, 2008 at 9:58 PM, Tim Hollosy <hollosyt@xxxxxxxxx> wrote:
>
>
> I'm hoping some Spring gurus can help me out, whenever I try to
> execute a query I get the error: Attempting to execute an operation on
> a closed EntityManager.
>
> I'm using Spring 2.5 + Tomcat6.
>
> The weird thing is find's work fine. I'm launching tomcat with the
> spring-aspects.jar for weaving. I'm new to this whole spring web stuff
> so I am probably missing something, but the only thing I could find
> online was to make sure I have the @Transactional annotations used
> everywhere in my DAO class, which I do.
>
> If I run in the debugger it looks like the EM is open as well, so I'm
> kind of stumped. I suspect some weaving shenanigans, but I'm too much
> of a neophyte at this right now to debug much more.
>
> Many thanks :)
>
> Here's my config:
>
> applicationcontext.xml;
> <context:component-scan base-package="com.redacted" />
>
>        <tx:annotation-driven mode="aspectj"/>
>
>    <bean id="transactionManager"
> class="org.springframework.orm.jpa.JpaTransactionManager"
>          p:entityManagerFactory-ref="entityManagerFactory"/>
>
>        <bean id="dataSource"
>                class="org.apache.commons.dbcp.BasicDataSource">
>                <property name="driverClassName"
> value="oracle.jdbc.OracleDriver" />
>                <property name="url"
> value="jdbc:oracle:thin:@redacted:1521:redacted" />
>                <property name="username" value="redacted" />
>                <property name="password" value="redacted" />
>        </bean>
>
>        <bean id="jpaAdapter"
> class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
>   <property name="databasePlatform"
> value="org.eclipse.persistence.platform.database.oracle.OraclePlatform"
> />
>   <property name="showSql" value="true" />
> </bean>
>
>
>  <bean id="loadTimeWeaver"
> class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
>
>  <bean id="entityManagerFactory"
> class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
>       <property name="persistenceUnitName" value="ProofOConcept"/>
>       <property name="dataSource" ref="dataSource"/>
>       <property name="jpaVendorAdapter" ref="jpaAdapter"/>
>       <property name="loadTimeWeaver" ref="loadTimeWeaver"/>
>
>    </bean>
>
>        <util:list id="annotatedClasses">
>                <value>com.redacted.*</value>
>        </util:list>
>
>
> Here's my DAO class:
>
> import java.util.List;
>
> import javax.persistence.EntityManager;
> import javax.persistence.PersistenceContext;
> import javax.persistence.Query;
>
> import org.eclipse.persistence.jpa.JpaEntityManager;
> import org.eclipse.persistence.jpa.JpaHelper;
> import org.springframework.stereotype.Repository;
> import org.springframework.transaction.annotation.Transactional;
>
> @Transactional
> @Repository
> public class BasicDao {
>
>        @PersistenceContext(unitName = "ProofOConcept")
>        private EntityManager em;
>
>        @Transactional(readOnly = true)
>        public <T> T find(Class<T> entityClass, Object primaryKey) {
>                T result = em.find(entityClass, primaryKey);
>
>                return result;
>        }
>
>
>
>        @Transactional(readOnly = true)
>        public <T> List<T> selectAll(Class<T> clazz) {
>                JpaEntityManager jpaEm = JpaHelper.getEntityManager(em);
>                Query query = jpaEm.createQuery(null, clazz);
>                return (List<T>) query.getResultList();
>        }
>
> }
>
>
>
>
>
>
> ./tch
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>
>
>
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>
>
>
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>
>
> --
>
>
>
> Shaun Smith | Principal Product Manager, TopLink | +1.905.502.3094
> Oracle Fusion Middleware
> 110 Matheson Boulevard West, Suite 100
> Mississauga, Ontario, Canada L5R 3P4
>
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>
>


Back to the top