users@glassfish.java.net

Re: embedded ejb container - JTA and entity managers

From: Phillip Ross <phillip.w.g.ross_at_gmail.com>
Date: Thu, 3 Mar 2011 14:36:35 -0500

Here's an inline, slightly abbreviated version of my persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
             version="2.0">

    <persistence-unit name="default" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/test_ds</jta-data-source>
        <class>TestEntity</class>
        <properties>
            <property name="eclipselink.logging.level" value="SEVERE"/>
        </properties>
    </persistence-unit>
</persistence>

The real one has a different datasource name and lots more, real class
names, but this one illustrates the pu name and tx type I'm attempting to
use.

Another interesting datapoint, I added some code to interrogate the entity
manager and it seems to not know the server platform or claim to support
JTA. Code looks like this:
Object entityManagerDelegateObject = entityManager.getDelegate();
        logger.debug("Retrieved a delegate object of type {}",
entityManagerDelegateObject.getClass().getName());
        if (entityManagerDelegateObject instanceof EntityManagerImpl) {
            EntityManagerImpl entityManagerImpl =
(EntityManagerImpl)entityManager.getDelegate();
            Session session = entityManagerImpl.getSession();
            ServerPlatform serverPlatform = session.getServerPlatform();
            logger.debug("server platform: {}",
serverPlatform.getServerNameAndVersion());
            logger.debug("jta enabled: {}", serverPlatform.isJTAEnabled());
        }

And the output from this looks like this:
- Retrieved a delegate object of type
org.eclipse.persistence.internal.jpa.EntityManagerImpl
- server platform: null
- jta enabled: false

But placing the same code inside a stateless EJB produces this output:
- server platform: unknown
- jta enabled: true

I dont really know if this has anything to do with anything, but thought it
was interesting.


On Thu, Mar 3, 2011 at 1:33 PM, Mitesh Meswani <mitesh.meswani_at_oracle.com>wrote:

> On 3/3/2011 10:30 AM, Phillip Ross wrote:
>
>> at
>> org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.checkForTransaction(EntityTransactionWrapper.java:50)
>>
> Use of EntityTransactionWrapper implies that you are not using a JTA pu.
> Check your persistence.xml to make sure that it is a JTA pu.
>
> -Mitesh
>
> at
>> org.eclipse.persistence.internal.jpa.EntityManagerImpl.checkForTransaction(EntityManagerImpl.java:1666)
>>
>
>