Hibernate to JNDI

darksmilie

Erfahrenes Mitglied
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.
 
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
 
richtig.

Da ich meine anwendung auf einem Websphere Portal laufen habe und hibernate da ständig durchläuft und JNDI nicht ;).
 
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.
 
Hmm mein JNDI möchte einfach nicht laufen. Ich habe die DB - Daten in der Server Konfiguration abgelegt.

Meine hibernate.properties
Code:
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:
Code:
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.
 
So kleine Änderung:

hibernate.cfg.xml:
Code:
<?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:
Code:
	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:".
 
Hallo!

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

Gruß Tom
 
Zurück