# Hibernate to JNDI



## darksmilie (12. Juli 2006)

Hi

Weiß einer was ich alles umstellen muss wenn ich meine connection von Hibernate auf JNDI wechseln will oder hat jemand ein link von einer doku die das Erläutert.


----------



## Thomas Darimont (12. Juli 2006)

Hallo!



> Weiß einer was ich alles umstellen muss wenn ich meine connection von Hibernate auf JNDI wechseln will oder hat jemand ein link von einer doku die das Erläutert.


Was willst du denn genau tun? Willst du dass die Datenbankverbindung die Hibernate benutzt nicht von Hibernate selbst Konfiguriert wird, sondern stattdessen aus dem JNDI gezogen wird?

Gruß Tom


----------



## darksmilie (12. Juli 2006)

richtig.

Da ich meine anwendung auf einem Websphere Portal laufen habe und hibernate da ständig durchläuft und JNDI nicht .


----------



## Thomas Darimont (12. Juli 2006)

Hallo!

Das ist in der Hibernate Reference erklärt:
HIBERNATE - Relational Persistence for Idiomatic Java

Weiterhin bietet es sich an die SessionFactory auch im JNDI zu hinterlegen.

Gruß Tom


----------



## darksmilie (12. Juli 2006)

besten dank.


----------



## darksmilie (13. Juli 2006)

gibt es auch eine dokumentation über die einstellung am Server? ich programmiere mit dem Rational 6 und benutze als server ein Webshpere Portal 5.0 Testumgebung.


----------



## darksmilie (14. Juli 2006)

Hmm mein JNDI möchte einfach nicht laufen. Ich habe die DB - Daten in der Server Konfiguration abgelegt.

Meine hibernate.properties

```
hibernate.connection.datasource = java:/jdbc/jndiDB
hibernate.transaction.factory_class = \
    org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_lookup_class = \
    org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
```

meine SessionFactory:

```
private SessionFactory _sessionFactory;
	private Session _session;
    private ThreadLocal _threadLocal = new ThreadLocal();

	// Template Methods
	protected abstract String getKeyFieldName();
	protected abstract Class getStoredClass();	

	// Methods
	protected AbstractServiceDBImpl() {
//		initalizeHibernate();
        if (! isHibernateInitialized())
            initalizeHibernate();
	}
	
	protected Session getSession() throws HibernateException {
		Contract.require(isHibernateInitialized(), "hibernate ist initialisiert");

		Session session = (Session) _threadLocal.get();
        
		if (session == null || !session.isOpen()) {		
			session = _sessionFactory.openSession(); 
            _threadLocal.set(session);
		}
		/*try {
		    int i = 0;
			System.out.println(">>> session.connection().isClosed() " + session.connection().isClosed());
		} catch (HibernateException e) {
		    System.out.println("Probleme beim connect");
			//e.printStackTrace();
		} catch (SQLException e) {
		    System.out.println("Probleme beim connect");
			//e.printStackTrace();
		}*/	
				
		session.clear();
		
		Contract.ensure(session != null, "result");
		return session;
	}
  
    private boolean sessionIsConnected()
    {
//        return _session.isConnected();
        return ((Session) _threadLocal.get()).isConnected();
    }

	protected boolean isHibernateInitialized() {
	    return _sessionFactory != null;
	}

	/**
	 * Hibernate initialisieren. SessionFactory merken.
	 */
	private void initalizeHibernate() {
	    Contract.require(!isHibernateInitialized(), "Hibernate is not initialized yet");
	    try
	    {
	        // Konfigurationsdateien einlesen
	        URL mappingURL = getClass().getClassLoader().getResource("mapping.xml");
	        InputStream in = getClass().getClassLoader().getResourceAsStream("hibernate.properties");
	        
	        Properties properties = new Properties();
	        properties.load(in);
	
	        // Hibernate konfigurieren
	        Configuration configuration = new Configuration();
	        configuration.setProperties(properties);
	        configuration.addURL(mappingURL);
	
	        // SessionFactory merken! Sie erzeugt die benötigten Sessions.
	        _sessionFactory = configuration.buildSessionFactory();
	    }
	    catch (HibernateException e)
	    {
	        System.out.println("Probleme beim Konfigurieren von Hibernate!");
	        e.printStackTrace();
	    }
	    catch (IOException e)
	    {
	        System.out.println("Probleme beim Zugriff auf die Datei hibernate.properties");
	        e.printStackTrace();
	    }
	
	    Contract.ensure(isHibernateInitialized(), "Hibernate is successfully initialized");
	}
```

an der markierten Stelle meldet er ein Fehler.


----------



## darksmilie (14. Juli 2006)

So kleine Änderung:

hibernate.cfg.xml:

```
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <!-- a SessionFactory instance listed as /jndi/name -->
    <session-factory
        name="java:hibernate/SessionFactory">

        <!-- properties -->
        <property name="connection.datasource">java:/jdbc/jndiUrlaubsplaner</property>
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <property name="show_sql">false</property>
        <property name="transaction.factory_class">
            org.hibernate.transaction.JTATransactionFactory
        </property>

    </session-factory>

</hibernate-configuration>
```

SessionFactory:

```
private void initalizeHibernate() {
	    Contract.require(!isHibernateInitialized(), "Hibernate is not initialized yet");
	    try
	    {
	        // Konfigurationsdateien einlesen
	        URL mappingURL = getClass().getClassLoader().getResource("mapping.xml");
	        InputStream in = getClass().getClassLoader().getResourceAsStream("hibernate.cfg.xml");

	        Properties properties = new Properties();
	        properties.load(in);
	        System.out.println("test3");
	        // Hibernate konfigurieren
	        Configuration configuration = new Configuration();
	        configuration.setProperties(properties);
	        configuration.addURL(mappingURL);
	System.out.println("test4");
	        // SessionFactory merken! Sie erzeugt die benötigten Sessions.
	        _sessionFactory = configuration.configure("hibernate.cfg.xml").buildSessionFactory();
	    }
	    catch (HibernateException e)
	    {
	        System.out.println("Probleme beim Konfigurieren von Hibernate!");
	        e.printStackTrace();
	    }
	    catch (IOException e)
	    {
	        System.out.println("Probleme beim Zugriff auf die Datei hibernate.properties");
	        e.printStackTrace();
	    }
	
	    Contract.ensure(isHibernateInitialized(), "Hibernate is successfully initialized");
	}
```

als Fehlermeldung bekomme ich:


> [14.07.06 08:59:30:750 CEST] 6c805553 DatasourceCon F org.hibernate.connection.DatasourceConnectionProvider  Could not find datasource: java:/jdbc/jndiUrlaubsplaner
> [14.07.06 08:59:30:750 CEST] 6c805553 DatasourceCon F org.hibernate.connection.DatasourceConnectionProvider  TRAS0014I: Die folgende Ausnahmebedingung wurde protokolliert: javax.naming.NameNotFoundException: Name  not found in context "java:".


----------



## Thomas Darimont (14. Juli 2006)

Hallo!

Dann schau doch mal im Websphere JNDI Explorer in welchem JNDI Space deine SessionFactory / Connection nun gebunden wurde.

Gruß Tom


----------



## darksmilie (14. Juli 2006)

Was meinst denn du damit meine Rational Websphere Portal 5.0 Testumgebung besitzt sowas nicht.


----------



## darksmilie (17. Juli 2006)

Thomas Darimont hat gesagt.:
			
		

> Hallo!
> 
> Dann schau doch mal im Websphere JNDI Explorer
> 
> Gruß Tom



wo soll denn der sein?

bzw. ist es überhaupt möglich eine verbing mit jndi und hibernate in eine Portalanwendung herzustellen?


----------

