Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] SessionCustomizer to modify/detect database platform: impossible

A third workaround suggested by a colleague

- Use the eclipselink.metadata-source persistence unit property to point to a custom class that extends org.eclipse.persistence.jpa.metadata.MetadataSourceAdapter

- In your class implement

public Map<String, Object> getPropertyOverrides(Map<String, Object> properties, ClassLoader classLoader, SessionLog log)

and in the case where you need to specify the new platform, add the eclispelink.target-database property to that list.

This method is called immediately before login and should provide you what you need.

-Tom


On 21/02/2013 8:46 AM, Tom Ware wrote:
Hi Laird,

   It looks like the use-case where you want auto-detection of database platform
for all but a single platform is not well covered by the current code base.  I
see you've filed bug 401388 for this issue.  The easiest way for us to address
your specific issue is to make the isInformixOuterJoin flag a boolean on the
InformixPlatform that could be set in your customizer, this could be done
quickly, but would not help you for your 2.3.2 deployment.

   The possible workarounds I see are:

1. Pass the new platform as a property when your EntityManagerFactory is created
2. Try to override the auto-detection yourself.  This would involve roughly the
following steps
   - Use the eclipselink.target-database property in your persistence.xml to set
a platform... Any platform. (this setting will make EclipseLink avoid it's own
auto-detection code)
   - In a prelogin event use the code from our
DatabaseSessionImpl.loginAndDetectDatasource method to use our auto-detection
code and then override the InformixPlatform if it is detected.  Here is the code
as it exists.  You could override the platformName if it was the InformixPlatform:

--
                 try {
                     String vendorNameAndVersion =
conn.getMetaData().getDatabaseProductName() +
conn.getMetaData().getDatabaseMajorVersion();
                     platformName =
DBPlatformHelper.getDBPlatform(vendorNameAndVersion, getSessionLog());
                     getLogin().setPlatformClassName(platformName);
                 } catch (EclipseLinkException classNotFound) {
                     if (platformName.indexOf("Oracle") != -1) {
                         // If we are running against Oracle, it is possible
that we are running in an environment where
                         // the OracleXPlatform class can not be loaded. Try
using OraclePlatform class before giving up

getLogin().setPlatformClassName(OraclePlatform.class.getName());
                     } else {
                         throw classNotFound;
                     }
                 }
--

Sorry this is so involved.

-Tom

On 21/02/2013 1:43 AM, Laird Nelson wrote:
Is it possible to write a SessionCustomizer that jumps in early enough to
install a custom platform on a session, AND that is immune to the platform's
jettisoning of any installed platform upon initial login?

One of the first things that DatabaseSessionImpl.java does is to set the
session's associated platform--conveniently installed by my session
customizer--to null.  WTF.

In other words, a SessionCustomizer that I've written happily installs a new
platform...which is then immediately overwritten by the core EclipseLink
innards.  I see no way to prevent this overwriting.

A SessionEventListener which activates after a postLogin() event that does the
same thing results in dozens of NullPointerExceptions from deep within
QuerySequence.java later on in the persistence unit lifecycle, so that's not an
option.

Relevant StackOverflow question:
http://stackoverflow.com/questions/14899458/what-is-the-proper-way-to-have-a-user-authored-eclipselink-databaseplatform-subc


Best,
Laird

--
http://about.me/lairdnelson


_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users



Back to the top