Ok, the resolved issue. It looks it was openJPA. I swapped the
persistence provider with hibernate, and its working. I think I have
to look into openJPA docs to find a solution if I decided to use
openJPA.
Another  issue I was having is setting the persistence provider
through junit instead of persistence.xml. I do have some persistence
unit jars that I would like ot use, and it doesn't seem right to put
the persistence provider in these jars. To setup hibernate I had to
use the Sytem properties :

System.getProperties().setProperty("javax.persistence.provider",
"org.hibernate.ejb.HibernatePersistence");



Thank you all. Appreciate your help.


On Thu, Dec 17, 2009 at 6:51 PM, Mansour Al Akeel
<[email protected]> wrote:
> David,
> This link helped a lot. The info is very clear and brief. Thank you !
> I was able to fix this by injecting entityManagerFactory. I still
> don't understand many of the internals, but it's ok for now.
> This modification allowed me to persist a new object, but I am unable
> to delete objects. It seems the issue with JPA.
> Here's the working code for creating a new object, in case anyone
> faces similar issue:
>
>   �...@persistenceunit(unitName = "Testing")
>    private EntityManagerFactory factory;
>
>   �...@override
>    public Restaurant create(Restaurant obj)
>    {
>        EntityManager em = factory.createEntityManager();
>        EntityTransaction tx = em.getTransaction();
>        try
>            {
>                tx.begin();
>                obj = em.merge(obj);
>                em.persist(obj);
>                tx.commit();
>
>            } catch (Exception e)
>            {
>                logger.error("Can not create " + obj);
>                logger.error("Exception", e);
>            }
>        return obj;
>    }
>
> The code that's failing:
>
>   �...@override
>    public void delete(Restaurant obj)
>    {
>        EntityManager em = factory.createEntityManager();
>        EntityTransaction tx = em.getTransaction();
>        try
>            {
>                tx.begin();
>                obj = em.merge(obj);
>                em.remove(obj);
>                em.flush();
>                tx.commit();
>            } catch (Exception e)
>            {
>                logger.error("Can not create " + obj, e);
>            }
>    }
>
> The exception I am getting is:
> ERROR - Can not create
> org.apache.openjpa.enhance.ws$mansour$entities$restaurant$pcsubcl...@2dd7e4d6
> <openjpa-1.2.1-r752877:753278 nonfatal general error>
> org.apache.openjpa.persistence.PersistenceException: Unknown column
> 't0.ENTREE_ID' in 'where clause' {prepstmnt 1323538699 SELECT t0.id,
> t0.name, t0.vegetarian FROM Entree t0 WHERE t0.ENTREE_ID = ?
> [params=(long) 4]} [code=1054, state=42S22]
>        at 
> org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4232)
>        at 
> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4197)
>        at 
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:102)
>        at 
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:88)
>        at 
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:64)
>        at 
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:694)
> ......
> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: Unknown
> column 't0.ENTREE_ID' in 'where clause' {prepstmnt 1323538699 SELECT
> t0.id, t0.name, t0.vegetarian FROM Entree t0 WHERE t0.ENTREE_ID = ?
> [params=(long) 4]} [code=1054, state=42S22]
>        at 
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:192)
>        at 
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(LoggingConnectionDecorator.java:57)
>        at 
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeQuery(LoggingConnectionDecorator.java:852)
>        at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:262)
>        at 
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeQuery(JDBCStoreManager.java:1595)
>        at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:252)
>        at 
> org.apache.openjpa.jdbc.sql.SelectImpl.executeQuery(SelectImpl.java:496)
>
> I borrowed the entities for testing from
> http://blog.springsource.com/2006/05/30/getting-started-with-jpa-in-spring-20/
> The wiered thing, This test is working fine when using spring and
> injecting hibernate. What I need to do know, it to replace openJPA
> with hibernate or eclipseLink.
> But, I don't want to set any properties for a specific jpa provider in
> my persistence.xml. Is there a way to do this when initializing the
> container? I mean, here'e my JUnit setup and I want to add hibernate
> or eclipse link instead of, openJPA. This will help me better narrow
> down the issue.
>
> �...@beforeclass
>    public static void setUpBeforeClass() throws Exception
>    {
>        DBSetup.runDbUnitSetup();
>        logger.warn("Strating testing using OpenEJB");
>        Properties properties = new Properties();
>        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
>                "org.apache.openejb.client.LocalInitialContextFactory");
>        properties.put("openEjbDatabase", "new://Resource?type=DataSource");
>        properties.put("openEjbDatabase.JdbcDriver", "com.mysql.jdbc.Driver");
>        properties.put("openEjbDatabase.JdbcUrl",
>                "jdbc:mysql://neptune:3306/dbtest");
>        properties.put("openEjbDatabase.UserName", "sa");
>        properties.put("openEjbDatabase.PassWord", "");
>        context = new InitialContext(properties);
>        Object obj = context.lookup("RestaurantDao3Local");
>        dao = (IDao) obj;
>    }
>
>
> What do I need to add, to use hibernate/toplink/eclipselink instead of
> openJPA ?
>
>
> On Thu, Dec 17, 2009 at 6:14 AM, David Blevins <[email protected]> wrote:
>> Hi Mansour,
>>
>> Seems like you may have a mix of problems.  Check out this doc which
>> attempts to clarify JPA usage.
>>
>>  http://openejb.apache.org/3.0/jpa-concepts.html
>>
>> -David
>>
>> On Dec 16, 2009, at 4:46 AM, Mansour Al Akeel wrote:
>>
>>> I do have some dao working with spring and tested them as pojos. I am
>>> porting them to stateless beans. I am using User transaction (bean
>>> managed transaction).
>>> Following the example of  entityManager injection :
>>>
>>> public class RestaurantDaoTest3 extends AbstractRestaurantDaoTest {
>>>
>>>   private static Context context;
>>>
>>>   @BeforeClass
>>>   public static void setUpBeforeClass() throws Exception
>>>   {
>>>        DBSetup.runDbUnitSetup();
>>>        logger.warn("Strating testing using OpenEJB");
>>>        Properties properties = new Properties();
>>>        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
>>>                "org.apache.openejb.client.LocalInitialContextFactory");
>>>        properties.put("openEjbDatabase",
>>> "new://Resource?type=DataSource");
>>>        properties.put("openEjbDatabase.JdbcDriver",
>>> "com.mysql.jdbc.Driver");
>>>        properties.put("openEjbDatabase.JdbcUrl",
>>>                "jdbc:mysql://neptune:3306/dbtest");
>>>        properties.put("openEjbDatabase.UserName", "sa");
>>>        properties.put("openEjbDatabase.PassWord", "");
>>>
>>>        context = new InitialContext(properties);
>>>        Object obj = context.lookup("RestaurantDao3Local");
>>>        dao = (IDao) obj;
>>>   }
>>> }
>>>
>>> And the relevant dao code:
>>> �...@resource
>>>   private UserTransaction utx;
>>>   @Override
>>>   public Restaurant create(Restaurant obj)
>>>   {
>>>        Restaurant created = obj;
>>>        try
>>>            {
>>>                utx.begin();
>>>                obj = getEntityManager().merge(obj);
>>>                getEntityManager().persist(obj);
>>>                getEntityManager().flush();
>>>                utx.commit();
>>>            } catch (Exception e)
>>>            {
>>>                e.printStackTrace();
>>>            }
>>>        return created;
>>>   }
>>>
>>> The exception I am getting:
>>> <openjpa-1.2.1-r752877:753278 nonfatal user error>
>>> org.apache.openjpa.persistence.TransactionRequiredException: Can only
>>> perform operation while a transaction is active.
>>>        at
>>> org.apache.openjpa.kernel.BrokerImpl.assertActiveTransaction(BrokerImpl.java:4380)
>>>        at
>>> org.apache.openjpa.kernel.DelegatingBroker.assertActiveTransaction(DelegatingBroker.java:1330)
>>>        at
>>> org.apache.openjpa.persistence.EntityManagerImpl.flush(EntityManagerImpl.java:591)
>>>        at
>>> org.apache.openejb.persistence.JtaEntityManager.flush(JtaEntityManager.java:130)
>>>
>>> This is my persistence.xml:
>>>
>>> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
>>> <persistence version="1.0"
>>>        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
>>> http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
>>> http://java.sun.com/xml/ns/persistence/orm
>>> http://java.sun.com/xml/ns/persistence/orm_1_0.xsd";
>>>        xmlns="http://java.sun.com/xml/ns/persistence";
>>> xmlns:orm="http://java.sun.com/xml/ns/persistence/orm";
>>>        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
>>>        <persistence-unit name="Testing" transaction-type="RESOURCE_LOCAL">
>>>                <class>ws.mansour.entities.Restaurant</class>
>>>        </persistence-unit>
>>> </persistence>
>>>
>>>
>>> I do have few quesitons here:
>>> 1- In the jndi Resource, I added openEjbDatabase as a DataSource, but
>>> I don't understand how did it got picked by other DAO operations (ie.
>>> read).
>>> 2- I am using RESOURCE_LOCAL at transaction type, which indicates that
>>> the container (context) will not handle this. How do I create a
>>> tranaction ? With spring I was not able to do
>>> entityManager.getTranaction(), because the entityManager injected by
>>> spring is proxied (AFAIK). Doing this here, will give me another
>>> error, for example:
>>>        try
>>>            {
>>>                getEntityManager().getTransaction().begin();
>>>                obj = getEntityManager().merge(obj);
>>>                getEntityManager().persist(obj);
>>>                getEntityManager().flush();
>>>                getEntityManager().getTransaction().commit();
>>>            } catch (Exception e)
>>>
>>> will give:
>>>
>>> java.lang.IllegalStateException: A JTA EntityManager can not use the
>>> EntityTransaction API.  See JPA 1.0 section 5.5
>>>        at
>>> org.apache.openejb.persistence.JtaEntityManager.getTransaction(JtaEntityManager.java:220)
>>>
>>> What am I doing wrong ?
>>>
>>
>>
>

Reply via email to