All,

I came across to get the solution, as following:

1. for J2EE env, the persistence must use JNDI;
2. the openejb.xml, must use tag <connection> instead of Resource.

Hope this can be helpful when using openejb over openjpa.

--
John



John_canada wrote:
> 
> Thanks lots Mike.
> 
> Actually what I wanted was to simply specify a connection in
> persistence.xml, if can not, then specifying in openejb-jar.xml (or
> openejb.xml, in same META-INF folder).
> 
> the pesistence.xml as
> <persistence-unit name="aUnit" > 
> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
> 
>       <class>ejb.Person</class>
>       <properties>
>       <property name="openjpa.ConnectionURL"
> value="jdbc:mysql://localhost:3306/aa"/>
>       <property name="openjpa.ConnectionDriverName"
> value="com.mysql.jdbc.Driver"/>
>       <property name="openjpa.ConnectionUserName" value="root"/>
>       <property name="openjpa.ConnectionPassword" value="pass"/>
>       <property name="openjpa.Log" value="DefaultLevel=INFO, SQL=TRACE"/>
> ...
> 
> The db info is correct (tested in dos command prompt). however, it when
> trying to connect via calling entity bean, I still got:
> javax.ejb.EJBException: The bean encountered a non-application exception;
> nested exception is: 
>       <openjpa-1.2.1-r752877:753278 nonfatal general error>
> org.apache.openjpa.persistence.PersistenceException: There were errors
> initializing your configuration: <openjpa-1.2.1-r752877:753278 fatal user
> error> org.apache.openjpa.util.UserException: A connection could not be
> obtained for driver class "com.mysql.jdbc.Driver" and URL
> "jdbc:mysql://localhost:3306/aa".  You may have specified an invalid URL.
>       at
> org.apache.openjpa.jdbc.schema.DataSourceFactory.newConnectException(DataSourceFactory.java:256)
>       at
> org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:242)
>       at
> org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getConnectionFactory(JDBCConfigurationImpl.java:692)
> ...
> 
> Was this (connection issue) in jpa package or in ejb package? 
> 
> --
> John
> 
> 
> Michael Dick wrote:
>> 
>> At least some of this will be better handled by the OpenEJB / Tomcat
>> folks
>> and we can certainly cross post the question on their mailing list(s) if
>> needed.
>> 
>> From an OpenJPA point of view you should be able to specify the
>> connection
>> properties (openjpa.ConnectionURL, openjpa.ConnectionDriverName, etc.) or
>> use a jta-data-source in persistence.xml. If you use a jta-data-source
>> then
>> the only requirement is that the value you provide (ie contextDS) is
>> available in JNDI. Usually a datasource will be bound to a location like
>> jdbc/${my datasource name} (coming from a WebSphere background, but I
>> believe this is fairly common), Tomcat might expect a similar context
>> root -
>> would have to check Tomcat's doc to be sure.
>> 
>> The error you're getting can indicate a lot of things though :
>> 1. The ConnectionURL is incorrect
>> 2. The UserID & Password aren't correct
>> 3. There's a firewall blocking port 3306
>> 4. MySQL is configured to only accept remote connections to the ejb
>> database
>> (pretty unlikely, but you could do this).
>> 
>> To eliminate those as possibilities, can you try connecting directly to
>> the
>> database (ie no JPA / Tomcat / etc)? If you can connect then it's likely
>> that something is getting in the way.
>> 
>> If you'd rather pursue the JNDI path (ie your questions about openejb.xml
>> and datasource configuration) then you / we will have to re-post on
>> us...@openejb for expert advice.
>> 
>> -mike
>> 
>> On Wed, Jul 1, 2009 at 4:14 PM, John_canada <[email protected]> wrote:
>> 
>>>
>>> Thanks for the quick reply, Rick.
>>>
>>> Eventually I found out it was about the datasource config:
>>>
>>> in such case(using Tomcat), the
>>> my.war/WEB-INF/classes/META-INF/persistence.xml
>>> 1. should not specify any database info but the datasource id (specified
>>> in
>>> /tomcat/conf/openejb.xml), as
>>>
>>> 
>>> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
>>>         <jta-data-source>contextDS</jta-data-source>
>>>
>>> if specifying the database info, like
>>> <property name="openjpa.ConnectionURL"
>>>                value="jdbc:mysql://localhost:3306/ejb"/>
>>>            <property name="openjpa.ConnectionDriverName"
>>>          ...
>>> then the following error found:
>>>
>>> <openjpa-1.2.1-r752877:753278 fatal user error>
>>> org.apache.openjpa.persistence.ArgumentException: A connection could not
>>> be
>>> obtained for driver class "com.mysql.jdbc.Driver" and URL
>>> "jdbc:mysql://localhost:3306/ejb".  You may have specified an invalid
>>> URL.
>>>
>>>
>>> org.apache.openjpa.jdbc.schema.DataSourceFactory.newConnectException(DataSourceFactory.java:256)
>>>
>>>
>>> org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:242)
>>>
>>>
>>> org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getConnectionFactory(JDBCConfigurationImpl.java:692)
>>>
>>>
>>> org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDataSource(JDBCConfigurationImpl.java:790)
>>>
>>>
>>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.setContext(JDBCStoreManager.java:136)
>>>
>>>
>>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.setContext(JDBCStoreManager.java:120)
>>>
>>>
>>> org.apache.openjpa.kernel.DelegatingStoreManager.setContext(DelegatingStoreManager.java:78)
>>>       
>>> org.apache.openjpa.kernel.BrokerImpl.initialize(BrokerImpl.java:309)
>>>
>>>
>>> org.apache.openjpa.kernel.AbstractBrokerFactory.initializeBroker(AbstractBrokerFactory.java:216)
>>>
>>>
>>> org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:190)
>>>
>>>
>>> org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:142)
>>>
>>>
>>> org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:192)
>>>
>>>
>>> org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:56)
>>>
>>>
>>> org.apache.openejb.persistence.JtaEntityManagerRegistry.getEntityManager(JtaEntityManagerRegistry.java:105)
>>>
>>>
>>> org.apache.openejb.persistence.JtaEntityManager.getEntityManager(JtaEntityManager.java:61)
>>>
>>>
>>> org.apache.openejb.persistence.JtaEntityManager.persist(JtaEntityManager.java:97)
>>> ...
>>>
>>> 2. create and place up openejb.xml and open-ejb-jar.xml in the same
>>> METTA-INF folder, companied with persistence.xml, then the created
>>> entity
>>> bean and its data can be found/accessed in run time (in debug), but it's
>>> not
>>> persisted in database.
>>>
>>> openejb-jar.xml
>>>    <dep:environment>
>>>        <dep:moduleId>
>>>            <dep:groupId>myEJB</dep:groupId>
>>>            <dep:artifactId>EJB</dep:artifactId>
>>>            <dep:version>2.0</dep:version>
>>>            <dep:type>car</dep:type>
>>>        </dep:moduleId>
>>>    </dep:environment>
>>>    <name:cmp-connection-factory>
>>>        <name:pattern>
>>>            <name:groupId>console.myTX</name:groupId>
>>>            <name:artifactId>myTX</name:artifactId>
>>>        </name:pattern>
>>>    </name:cmp-connection-factory>
>>>
>>> data info in openejb.xml as:
>>>         <Resource id="myTX" type="DataSource">
>>>                JdbcDriver com.mysql.jdbc.Driver
>>>                 ...
>>>         </Resource>
>>>        <Resource id="myNOTX" type="DataSource">
>>>                JdbcDriver com.mysql.jdbc.Driver
>>>                 ....
>>>        </Resource>
>>>
>>> the persistence.xml:
>>> <persistence-unit name="aUnit" >
>>>         <jta-data-source>myTX</jta-data-source>
>>>        <non-jta-data-source>myNOTX</non-jta-data-source>
>>> ...
>>>
>>> so, my question became, how to specify the datasource out of
>>> /tomcat/conf/?
>>>
>>> Thanks in advance.
>>>
>>> --
>>> John
>>>
>>>
>>>
>>> Rick Curtis wrote:
>>> >
>>> > John -
>>> >
>>> > It looks like you annotated your Person.id to be unique, but you
>>> didn't
>>> > specify a value... I'm assuming that you're using an AI column for
>>> your
>>> > id.
>>> > I see you're running on MySQL, so try adding the annotation
>>> > @GeneratedValue(strategy=GenerationType.IDENTITY) to your id column.
>>> If
>>> > that
>>> > doesn't work, please post a snippet of your Entity/mapping file(s).
>>> >
>>> > -Rick
>>> >
>>> > On Wed, Jul 1, 2009 at 12:44 PM, John_canada <[email protected]>
>>> wrote:
>>> >
>>> >>
>>> >> Hi,
>>> >>
>>> >> I deployed openejb.war in tomcat, and tested a web app which used
>>> ejb3;
>>> >> it's
>>> >> very simple: a servlet called a stateless bean, which created an
>>> entity
>>> >> as
>>> >> following:
>>> >>
>>> >> session bean:
>>> >> @PersistenceContext(unitName="aUnit",type =
>>> >> PersistenceContextType.TRANSACTION)
>>> >> private EntityManager manager;
>>> >>
>>> >> Person p = new Person(name, address);
>>> >> manager.persist(p);
>>> >> manager.flush();
>>> >>
>>> >> the persistence.xml:
>>> >> <persistence-unit name="aUnit" transaction-type="JTA">
>>> >>
>>> >>
>>> >>
>>> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
>>> >>        <jta-data-source>myTX</jta-data-source>
>>> >>        <non-jta-data-source>myNOTX</non-jta-data-source>
>>> >>        <class>ejb.Person</class>
>>> >>  ...
>>> >>
>>> >> openejb.xml:
>>> >>        <Resource id="myTX" type="DataSource">
>>> >>                JdbcDriver com.mysql.jdbc.Driver
>>> >>                JdbcUrl jdbc:mysql://localhost:3306/a
>>> >>                UserName root
>>> >>                Password aaa
>>> >>        </Resource>
>>> >>
>>> >>        <Resource id="myNOTX" type="DataSource">
>>> >>                JdbcDriver com.mysql.jdbc.Driver
>>> >>                JdbcUrl jdbc:mysql://localhost:3306/a
>>> >>                UserName root
>>> >>                Password aaa
>>> >>                JtaManaged false
>>> >>        </Resource>
>>> >>
>>> >> However, I got the following error when executing manager.flush();
>>> >> org.apache.openjpa.lib.jdbc.ReportingSQLException: Attempt to insert
>>> null
>>> >> into a non-nullable column: column: ID table: PERSON in statement
>>> [INSERT
>>> >> INTO person (person_id, address, name) VALUES (?, ?, ?)] {prepstmnt
>>> >> 6240623
>>> >> INSERT INTO person (person_id, address, name)
>>> >>    VALUES (?, ?, ?)
>>> >> [params=(long) 2201, (String) any address, (String) name]} [code=-10,
>>> >> state=23000]
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:192)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(LoggingConnectionDecorator.java:57)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:866)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:269)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1504)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.executeUpdate(PreparedStatementManagerImpl.java:151)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:120)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushAndUpdate(BatchingPreparedStatementManagerImpl.java:82)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:89)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:72)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:543)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:105)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:59)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:89)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:72)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:655)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130)
>>> >>       
>>> org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2010)
>>> >>
>>> >> org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1908)
>>> >>       
>>> org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1679)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.kernel.DelegatingBroker.flush(DelegatingBroker.java:989)
>>> >>
>>> >>
>>> >>
>>> org.apache.openjpa.persistence.EntityManagerImpl.flush(EntityManagerImpl.java:592)
>>> >>
>>> >>
>>> >>
>>> org.apache.openejb.persistence.JtaEntityManager.flush(JtaEntityManager.java:130)
>>> >>        ejb.HelloBean.createPerson(HelloBean.java:31)
>>> >>        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.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:158)
>>> >>
>>> >>
>>> >>
>>> org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:141)
>>> >>
>>> >>
>>> >>
>>> org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:122)
>>> >>
>>> >>
>>> >>
>>> org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:221)
>>> >>
>>> >>
>>> >>
>>> org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:174)
>>> >>
>>> >>
>>> >>
>>> org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:217)
>>> >>
>>> >>
>>> >>
>>> org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:77)
>>> >>
>>> >>
>>> >>
>>> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:281)
>>> >>        $Proxy46.createPerson(Unknown Source)
>>> >>        test.HelloServlet.doGet(HelloServlet.java:31)
>>> >>        javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
>>> >>        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
>>> >>
>>> >>
>>> >> It's obvious, from
>>> >> INSERT INTO person (person_id, address, name)
>>> >>    VALUES (?, ?, ?)
>>> >> [params=(long) 2201, (String) any address, (String) name]} [code=-10,
>>> >> state=23000]
>>> >>
>>> >> the parms values were taken, but did not pass/forward to database -
>>> this
>>> >> should not be in ejb3 package.
>>> >>
>>> >> Can anyone tell how to fix it?
>>> >>
>>> >> Thanks
>>> >> --
>>> >> John
>>> >> --
>>> >> View this message in context:
>>> >>
>>> http://n2.nabble.com/did-pass-params---Attempt-to-insert-null-into-a-non-nullable-column-tp3190581p3190581.html
>>> >> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>>> >>
>>> >>
>>> >
>>> >
>>>
>>> --
>>> View this message in context:
>>> http://n2.nabble.com/did-pass-params---Attempt-to-insert-null-into-a-non-nullable-column-tp3190581p3191855.html
>>> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>>>
>>>
>> 
>> 
> 
> 

-- 
View this message in context: 
http://n2.nabble.com/did-pass-params---Attempt-to-insert-null-into-a-non-nullable-column-tp3190581p3200721.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to