Questions & Answers

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

Type a product name