This is a strange error indeed. I would have expected to see any
agent related issues much sooner (i.e. while the vm is booting) rather
than at EJB method invoke time. I assume line 85 of your test case
corresponds to "svc.createObject(key);"
The strange part is that EclipseLink seems to be trying to create its
own DataSource instances which is a no-no. We need to figure out how
to get it to stop doing that and to use the ones we provide instead.
Can you post your startup log output? It should show which
DataSources have been linked to the persistence-unit.
One side thing I notice is that you've named your InitialContext
configured DataSource "TestPU" which is the same name as your
persistence unit. The effect of that is that all the properties you
set on "TestPU" will be applied to your persistence unit as well.
Normally this is fine as the PersistenProvider will usually just
ignore properties it doesn't support, but I wonder if one or more of
these extra properties might be what causes EclipseLink to try and
create DataSources on its own. Try renaming the InitialContext
configured DataSource to something else like "TestDS".
One last thing you could try is to remove the eclipse link agent and
use our agent jar instead, then explicitly list the classes that need
to be dynamically enhanced via the <class> tag in your persistence
unit declaration. What we'll do is attempt to get your persistence
provider to enhance those classes before JUnit loads them and they can
not longer be enhanced -- unless of course you're on Java 6 and then
you don't need a JavaAgent anymore as classes can be redifined by the
Persistence Provider via hooks that are available post-startup. Not
sure if EclipseLink supports that though. I know OpenJPA does and the
two are pretty competitive feature wise.
Hope some part of this is helpful.
-David
On Nov 25, 2009, at 5:26 PM, babstr wrote:
I have been attempting to use OpenEJB for unit testing a JavaEE
application
which uses EclipseLink as its Persistence provider. In order to
verify that
everything works I created a simple JavaEE application that consists
of one
EJB with local interface methods and two JPA entities. With this
setup, I
was able to get a unit test which invokes an EJB local method which
in turn
creates and removes instances of the JPA entities.
Now, a problem occurs if I create a relation between the two JPA
entities
that is marked as FetchType.LAZY. These relation types requires
weaving of
the bytecode. So, I went ahead and added the eclipselink.jar to the
command-line for the unit tests using the javaagent parameter.
Once, I do
this, the unit test no longer runs, but instead I get the following
error
message:
The bean encountered a non-application exception; nested exception is:
javax.persistence.PersistenceException: Exception
[EclipseLink-4021]
(Eclipse Persistence Services - 1.1.0.r3634):
org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Unable to acquire a connection from driver
[null],
user [null] and URL [null]. Verify that you have set the expected
driver
class and URL. Check your login, persistence.xml or sessions.xml
resource.
The jdbc.driver property should be set to a class that is compatible
with
your database platform
javax.ejb.EJBException: The bean encountered a non-application
exception;
nested exception is:
javax.persistence.PersistenceException: Exception
[EclipseLink-4021]
(Eclipse Persistence Services - 1.1.0.r3634):
org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Unable to acquire a connection from driver
[null],
user [null] and URL [null]. Verify that you have set the expected
driver
class and URL. Check your login, persistence.xml or sessions.xml
resource.
The jdbc.driver property should be set to a class that is compatible
with
your database platform
at
org
.apache
.openejb
.core
.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:
358)
at
org
.apache
.openejb
.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:286)
at $Proxy34.createObject(Unknown Source)
at HellowWorldTest.testPersistence(HellowWorldTest.java:85)
Caused by: javax.persistence.PersistenceException: Exception
[EclipseLink-4021] (Eclipse Persistence Services - 1.1.0.r3634):
org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Unable to acquire a connection from driver
[null],
user [null] and URL [null]. Verify that you have set the expected
driver
class and URL. Check your login, persistence.xml or sessions.xml
resource.
The jdbc.driver property should be set to a class that is compatible
with
your database platform
at
org
.eclipse
.persistence
.internal
.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:272)
at
org
.eclipse
.persistence
.internal
.jpa
.EntityManagerFactoryImpl
.getServerSession(EntityManagerFactoryImpl.java:111)
at
org
.eclipse
.persistence
.internal
.jpa
.EntityManagerFactoryImpl
.createEntityManagerImpl(EntityManagerFactoryImpl.java:163)
at
org
.eclipse
.persistence
.internal
.jpa
.EntityManagerFactoryImpl
.createEntityManager(EntityManagerFactoryImpl.java:158)
at
org
.apache
.openejb
.persistence
.JtaEntityManagerRegistry
.getEntityManager(JtaEntityManagerRegistry.java:105)
at
org
.apache
.openejb
.persistence.JtaEntityManager.getEntityManager(JtaEntityManager.java:
61)
at
org
.apache
.openejb.persistence.JtaEntityManager.persist(JtaEntityManager.java:
97)
at or.babic.HellowWorldBean.createObject(HellowWorldBean.java:
47)
at
org.apache.openejb.core.interceptor.ReflectionInvocationContext
$Invocation.invoke(ReflectionInvocationContext.java:158)
at
org
.apache
.openejb
.core
.interceptor
.ReflectionInvocationContext
.proceed(ReflectionInvocationContext.java:141)
at
org
.apache
.openejb
.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:122)
at
org
.apache
.openejb
.core.stateless.StatelessContainer._invoke(StatelessContainer.java:
221)
at
org
.apache
.openejb
.core.stateless.StatelessContainer.invoke(StatelessContainer.java:174)
at
org
.apache
.openejb
.core
.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:
217)
at
org
.apache
.openejb
.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:77)
at
org
.apache
.openejb
.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:281)
Caused by: Exception [EclipseLink-4021] (Eclipse Persistence
Services -
1.1.0.r3634): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Unable to acquire a connection from driver
[null],
user [null] and URL [null]. Verify that you have set the expected
driver
class and URL. Check your login, persistence.xml or sessions.xml
resource.
The jdbc.driver property should be set to a class that is compatible
with
your database platform
at
org
.eclipse
.persistence
.exceptions
.DatabaseException
.unableToAcquireConnectionFromDriverException(DatabaseException.java:
365)
at
org
.eclipse
.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:
90)
at
org
.eclipse
.persistence
.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:
162)
at
org
.eclipse
.persistence
.internal
.sessions
.DatabaseSessionImpl
.loginAndDetectDatasource(DatabaseSessionImpl.java:583)
at
org
.eclipse
.persistence
.internal
.jpa
.EntityManagerFactoryProvider
.login(EntityManagerFactoryProvider.java:227)
I have tried various configurations with the InitialContext, but so
far have
been unsuccessful. Any insight into this problem would be greatly
appreciated.
Here is a breakdown of the sample code:
OpenEJB v3.1.2
EclipseLink v1.1
DB Oracle 10g
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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_1_0.xsd">
<persistence-unit name="TestPU">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</
provider>
<jta-data-source>jdbc/MyDatasource</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level" value="FINEST"/>
</properties>
</persistence-unit>
</persistence>
public class HellowWorldTest {
@Test
public void testPersistence() throws Exception {
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.client.LocalInitialContextFactory");
props.put("TestPU", "new://Resource?type=DataSource");
props.put("TestPU.JtaManaged", "true");
props.put("TestPU.JdbcDriver", "oracle.jdbc.OracleDriver");
props.put("TestPU.JdbcUrl", "jdbc:oracle:thin:@localhost:
1521:XE");
props.put("TestPU.username", "username");
props.put("TestPU.password", "password");
Context ctx = new InitialContext(props);
HellowWorldLocal svc = (HellowWorldLocal)
ctx.lookup(HellowWorldBean.class.getSimpleName() + "Local");
String key = "test-persistence-"+System.currentTimeMillis();
svc.createObject(key);
}
}
@Stateless
public class HellowWorldBean implements HellowWorldLocal {
@PersistenceContext(unitName = "TestPU")
private EntityManager em;
/** local interface */
public void createObject(String parameter) {
Tester tester = new Tester();
tester.setId(parameter);
T2 t2 = new T2();
t2.setId(parameter+System.currentTimeMillis());
tester.setT2(t2);
em.persist(tester);
}
}
@Entity
@Table(name="TESTER")
public class Tester implements java.io.Serializable {
@Id
@Column(name="id")
private String id;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "T2_FK")
private T2 T2 = null;
public void setId(String id) {
this.id = id;
}
public String getId() {
return this.id;
}
public void setT2(T2 t2) {
this.T2 = t2;
}
public T2 getT2() {
return this.T2;
}
}
@Entity
@Table(name="T2")
public class T2 implements java.io.Serializable {
@Id
private String id;
@OneToOne(mappedBy = "T2")
private Tester tester;
public void setId(String id) {
this.id = id;
}
public String getId() {
return this.id;
}
public void setTester(Tester tester) {
this.tester = tester;
}
public Tester getTester() {
return this.tester;
}
}
--
View this message in context:
http://old.nabble.com/When-using-EclipseLink-javaagent%2C-EntityManager-is-unable-to-open-a-connection-to-DB-tp26515795p26515795.html
Sent from the OpenEJB User mailing list archive at Nabble.com.