Hi Doug
The class org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory()
uses org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.
The methods JPAInitilaizer.findPersistenceUnitInfo() and
JPAInitializer.findPersistenceUnitInfoInArchives() suggest that the
information is looked up in the Persistence XML. I managed to create
Persistence units on the fly by writing a new PersistenceProvider
implementation but wanted to avoid this as I wasn't sure that my
Persistence Provider was complete in all respects. Is that what you
are referring to?
Other than that if I continue to use the serverSession API as below,
then I hope I will still be able to use SessionCustomizer,
SessionEventAdapter if I need them at a later point of time.
Thanks
Rohit
On 6/1/2011 4:46 PM, Doug Clarke wrote:
Rohit,
It is possible to create EclipseLink persistence units on the
fly without any XML. I need to search for the code sample but
know there is some examples around. I know in the Dynamic
Persistence work or 2.2 I had also written some.
Doug
Hi All
The following code snippet worked for me:
DatabaseLogin login = new DatabaseLogin();
...
serverSession = new ServerSession(login);
//
serverSession.setProperty(PersistenceUnitProperties.LOGGING_LOGGER,
CustomLogger.class.getClass());
// does not work
serverSession.setSessionLog(new CustomLogger()); //
this works
serverSession.login();
emf =
JpaHelper.createEntityManagerFactory(serverSession);
dynamicHelper = new JPADynamicHelper(emf);
Thanks a lot Tom for helping me through this one.
I am unable to use the default PersistenceProvider as my
persistence units are created dynamically.
I could have also had a more elaborate implementation of my
custom PersistenceProvider. But for now serverSession APIs
seem to be sufficient.
Thanks
Rohit
On 5/31/2011 10:24 PM, Tom Ware wrote:
Hi
Rohit,
The properties you are passing in are processed by
EclipseLink as its PersistenceProvider class builds the
EntityManagerFactoryImpl.
To use these settings when you are forgoing that process by
creating your session and EntityManagerFactoryImpl, you will
have to set the underlying properties. (e.g. you will
actually have to set an instance of your logger into the
session)
I suspect you are not seeing the functionality from many
of the other properties either.
BTW: Weaving of non dynamic class will require use of our
PersistenceProvider.
-Tom
Rohit Banga wrote:
Hi Tom
The following code works for me:
I can get the program to work without PersistenceProvider.
DatabaseLogin login = new DatabaseLogin();
...
serverSession = new ServerSession(login);
serverSession.setProperty(PersistenceUnitProperties.TARGET_DATABASE,
...);
serverSession.setProperty(PersistenceUnitProperties.LOGGING_LEVEL,
SessionLog.FINEST_LABEL);
serverSession.setProperty(PersistenceUnitProperties.LOGGING_LOGGER,
CustomLogger.class.getName());
serverSession.setProperty(PersistenceUnitProperties.WEAVING,
"true");
serverSession.setProperty(PersistenceUnitProperties.WEAVING_FETCHGROUPS,
"true");
serverSession.setProperty(PersistenceUnitProperties.TARGET_SERVER,
TargetServer.None);
serverSession.setProperty(PersistenceUnitProperties.CLASSLOADER,
CustomLogger.class.getClassLoader());
serverSession.login();
emf =
JpaHelper.createEntityManagerFactory(serverSession);
dynamicHelper = new JPADynamicHelper(emf);
I do see the logs on the standard output during
initialization.
But after login, I do not see any logs being done by my
CustomLogger.
Any idea how to fix this?
Thanks
Rohit
On 5/31/2011 8:21 PM, Tom Ware wrote:
Hi Rohit,
The implementation of createEntityManagerFactory in
the javax.persistence.Persistence class simply calls
createEntityManagerFactory on each PersistenceProvider
the resolver finds until one can provide a factory, so
avoiding that call is a matter of calling
createEntityManagerFactory() on EclipseLink's
implementation.
I am not sure what your requirements are related to
multiple entity manager factories. If you don't mind
having the same backing-session, you should be able to
do this by simply calling the createEntityManagerFactory
method multiple times. If you want different backing
sessions, the "eclipselink.session-name" property can be
specified with a different name each time you call that
method.
If you do not want a persistence.xml, you can use our
JpaHelper class to create an EntityManagerFactory based
on a session you have previously created. The key is
that you need a session. (I am not really clear what
your requirements are in this regard)
EclipseLink also supports providing an alternate
persistence.xml location and filename. You can provide
this using the "eclipselink.persistencexml" property
passed in as part of the map argument to
createEntityManagerFactory.
-Tom
Rohit Banga wrote:
Hi Tom
I tried running my code with the default
PersistenceProvider implementation. But my usecase
requires multiple EntityManagerFactory's to be
instantiated. If in the
PersistenceProviderResolverHolder I specify
new PersistenceProvider() in place of new
MyPersistenceProvider() then I cannot specify the name
of the PersistenceUnit which is not able to located
the specific Persistence Unit.
emf =
Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME,
properties);
dynamicHelper = new JPADynamicHelper(emf);
serverSession = (ServerSession)
JpaHelper.getServerSession(emf);
Can I somehow do away with the
PersistenceProviderResolverHolder while still using
the default PersistenceProvider? I want to avoid using
a persistence.xml but if that is the recommended way I
will use that.
Thanks
Rohit
On 5/31/2011 7:06 PM, Tom Ware wrote:
Hi Rohit,
I think you are only the 2nd person we have heard
from on this group that was considering implementing
their own provider. As a result, we have not put
alot of effort into providing that kind of example.
There is quite alot of work done in our
PersistenceProvider code. If possible, it would
likely be considerably easier to leverage that
code. What do you need to customize?
-Tom
Rohit Banga wrote:
Hi Tom
Thanks for pointing out the insufficiency of the
code.
Since I am not doing any customizations should I
consider using
org.eclipse.persistence.jpa.PersistenceProvider.
Will that be a reasonable substitute?
Are there any examples / documentation available
for creating Custom Persistence Providers. Most of
the documentation I could find is about
persistence.xml.
Thanks
Rohit
On 5/31/2011 6:40 PM, Tom Ware wrote:
Hi Rohit,
To be honest, I am surprised such a sparse
implementation of PersistenceProvider with such
a sparsely populated instance of
SEPersistenceUnitInfo works. If you are
implementing your own persistence provider you
will definitely have to do more work with things
like the classloader than the typical user. As
an initial step, it is probably a good idea to
take a look at every property of
PersistenceUnitInfo and make sure you set it
correctly.
-Tom
Rohit Banga wrote:
Hi Tom
Class.forName() does not throw the same
exception.
I figured out another way to ensure that the
Class Loader is picked up correctly.
SEPersistenceUnitInfo puInfo = new
SEPersistenceUnitInfo();
puInfo.setClassLoader(MyLogger.class.getClassLoader());
EntityManagerSetupImpl.predeploy() contains
the following line to merge the properties:
Map predeployProperties =
mergeMaps(extendedProperties,
persistenceUnitInfo.getProperties());
The properties member variable of
SEPersistenceUnitInfo and the actual member
variables like classLoader are not in sync
with each other.
Though the setClassLoader method registers the
class loader a call to setProperties() on the
SEPersistenceUnitInfo does not populate the
classLoader member variable.
As a result the realClassLoader field in
EntityManagerSetupImpl.predeploy() is null.
puInfo.setClassLoader(MyLogger.class.getClassLoader());
I am not sure whether my implementation of
PersistenceProvider is correct or not. Can you
please see if I am missing something else in
MyPersistenceProvider code I sent earlier?
Thanks
Rohit
On 5/30/2011 9:19 PM, Tom Ware wrote:
My best guess about
your logger is that the string you are
passing in isn't formatted correctly (likely
due to the fact that it is an inner class).
To debug:
- try using a non-inner class to see if
you're getting the right loader
- Ensure you can do a Class.forName() using
that string to see if the string is correct
-Tom
Rohit Banga wrote:
Hi Tom
Yes that was a slip in my test code. Sorry
about that. So the properties are
inherited by default.
Other than that instead of using
SessionCustomizer I am planning to use
"eclipselink.logging.logger" to configure
my CustomLogger. But I am getting Class
not found exceptions. The CustomLogger is
a public static class nested inside the
main class. Any ideas what could be
causing this? I don't know what to specify
in the class loader property. I tried
setting it to
System.getProperty("|java.system.class.loader|").
does not work.
On 5/30/2011 8:47 PM, Tom Ware wrote:
Hi Rohit,
The only call I see to setLogLevel in
your example is on line 73. It sets the
log level on the clientSession. Am I
missing something?
A clientSession will have the same
logger as the server session that
created it, so any logging settings
should be the same between the sessions.
SessionCustomizers don't really make
sense on ClientSession since the things
you are likely to set in them are all
handled by the server session.
Is there some other setting that is
causing you problems?
-Tom
Rohit Banga wrote:
Hi All
I have a small question. I have
attached a sample program to make it
easy to see the problem.
I have set the LogLevel property on
the ServerSesssion. However if I do
not explicitly set the LogLevel
property on the clientSession, the
logs for the query execution are not
available on the console. I want a way
such that any property specified on
the server session, say
SessionCustomizer, Log Level etc. is
also available on the client session
automatically. Can anyone please tell
me how to do that using the sample
code provided?
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
------------------------------------------------------------------------
_______________________________________________
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
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
--
Thanks and Regards
Rohit Banga
Member Technical Staff
Oracle Server Technologies
|