bIT_sosswald
Returning Responder

Hibernate in FS-Service

Hallo zusammen,

ich möchte in einem FS-Modul, innerhalb eines Services Hibernate verwenden um direkt mit einer DB zu kommunizieren.

Die FS-Version ist 4.2.

Dazu habe ich über die Konffigurationsoberfläche einer ProjectApp die Konfigurationsparameter der DB konfiguriert.

Das Modul wird über ein Executable gestartet und liest die Parameter (in Abhängigkeit des Projektes aus dem das Executable gestartet wurde) und übergibt diese dann an den Service.

Innerhalb des Services mache ich dann folgendes:

public EntityManager createEntityManager() {

        Map<String, String> properties = new HashMap<>();

        // Ensure RESOURCE_LOCAL transactions is used.

        properties.put(TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name());

        // Configure the internal EclipseLink connection pool

        properties.put(JDBC_DRIVER, "oracle.jdbc.OracleDriver");

        properties.put(JDBC_URL, configuration.getDBConnectionString());

        properties.put(JDBC_USER, configuration.getDbUser());

        properties.put(JDBC_PASSWORD, configuration.getDbPassword());

        listLoadedClasses(this.getClass().getClassLoader());

        EntityManagerFactory createEntityManagerFactory = Persistence.createEntityManagerFactory("my-persistence-unit",

                properties);

        EntityManager entityManager = createEntityManagerFactory.createEntityManager();

        return entityManager;

    }

In der Zeile " EntityManagerFactory createEntityManagerFactory = Persistence.createEntityManagerFactory("my-persistence-unit", properties);" wird ein Fehler mit der folgenden Fehlermeldung geworfen:

ERROR 02.06.2014 13:36:30.028 (de.espirit.firstspirit.server.scheduler.ScriptTaskExecutor): error during script execution : javax.persistence.PersistenceException: No Persistence provider for EntityManager named my-persistence-unit

javax.persistence.PersistenceException: No Persistence provider for EntityManager named my-persistence-unit

    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)

    at com.xxx.model.Foo.createEntityManager(Foo.java:49)

Momentan habe ich das Gefühl, dass meine persistence.xml nicht gelesen wird.

Beim Debugging habe ich festgestellt, dass innerhalb der Klasse "javax.persistence.spi.PersistenceProviderResolverHolder" in dieser Methode die Variable "resolvers" bereits gefüllt ist. Leider mit einem leeren Value bzw. mit einem Value ohne verwertbarem Wert, was dazu führt, dass mein gesamtes Vorhaben scheitert.

Durchlaufe ich den selben Code lokal in einem Test bzw. einer Main-Methode, ist die Variable "resolvers" null. Die Verarbeitung geht in einen anderen Zweig und alles funktioniert einwandfrei.

Es scheint also einen Unterschied zwischen deploytem Modul und lokalem Test ohne Deployment zu geben.

1. Frage: Hat schon einmal jemand so etwas ähnliches gemacht?

2. Frage: Hat spontan jemand eine Idee wie man Hibernate in ein Modul integrieren kann um direkt (OHNE FS-API) mit einer externen DB zu kommunizieren? Bzw. Hat jemand eine Idee weshalb es einen Unterschied zwischen deploytem Modul und lokalem Test ohne Deployment gibt?

Ich werde mich morgen nochmal genau damit beschäftigen, aber ich bin schon jetzt für jeden Tipp oder jede Idee dankbar.

Beste Grüße

Sandro

0 Kudos
4 Replies
andre
I'm new here

hi Sandro,

schau mal hier evtl. hilf das.

--

andre

0 Kudos

Hallo André,

leider habe ich wohl keine Rechte die Seite anzusehen. Smiley Wink

Grüße

Sandro

0 Kudos

Hallo Sandro,

bei der verlinkten Seite handelt es sich um eine "interne" Diskussion. Deswegen wird sie dir nicht angezeigt.

Der Autor des anderen Postings erhielt ebenfalls immer eine PersistenceException bei dem Versuch eine externe Datenbank anzubinden.

Die Lösung des Problems war seinerzeit die folgenden Zeilen vor dem Verbindungsaufbau:

ClassLoader context = Thread.currentThread().getContextClassLoader();

ClassLoader caller = getClass().getClassLoader();

Thread.currentThread().setContextClassLoader(caller);

und diese Zeile danach:

Thread.currentThread().setContextClassLoader(context);

einzufügen.

Einer unserer Entwickler wies darauf hin, dass das Zurücksetzen in einem finally-Block durchgeführt werden sollte.

Viele Grüße

Michaela

Hallo Michaela,

vielen Dank für die Info, was in dem internen Posting stand.

Das klingt sehr hilfreich und deckt sich in seinen Auswirkungen ungefähr mit dem von mir beobachteten Fehlerursachen. (Classloader-Problem)

Wir haben uns jetzt allerdings dazu entschieden unsere DB-Anbindung per JDBC zu realisieren, da wir nur relativ kleine und unkomplizierte Abfragen machen und die Zeit uns im Nacken saß.

Von daher kann der Thread als geschlossen betrachtet werden. Ich werde den Tipp aber ausprobieren, wenn ich das nächste Mal aus einem Modul direkt auf deine DB zugreifen muss.

Nochmals Danke und beste Grüße

Sandro

0 Kudos