Oracle Hibernate + Oracle

  • Themenstarter Themenstarter Hans III
  • Beginndatum Beginndatum
H

Hans III

Gast
Hallo,
ich will meiner (WebApplication) einen Datenbankzugriff spendieren.

Ich habe bis jetzt nur über PHP Datenbankabfragen gemacht, weshalb ich anfangs dachte, dass es geht sicher genauso schnell und einfach.

Bei Java steh ich nun vor einem Berg von verschiedenen Frameworks die einem da helfen (sollen) und mit komplizierten Umsetzungen (zumindest mein erster Eindruck Drüberschauen, danach werd ich sicher sagen "wie trivial" - aber bis man soweit ist.....).

Da ich mich an eine Vorlesung erinnere, bei der wir eine abfrage mit Hibernate gemacht haben (Grundgerüste wurde uns dort leider gestellt, weshalb ich die Funktionsweise nicht direkt verstehe) und Kollegen auch meinten, sie würden Hibernate nutzen, entschied ich mich, damit meine abfragen zu realisieren.

Ich scheitere gerade schon an der hibernate.cfg.xml

Ich verstehe bei den meisten Einträgen noch nicht, was sie bedeuten. Aber denke, da wird irgend wann das Verständnis kommen. Mir gehts eher um die Verbindung zur Datenbank.

Folgendes habe ich (Beispielsangaben):
DB: Oracle11g
Hostname: oracleDBHost
Port: 1234
SID: 08ed15
user: derUSERNAME
password: dasPASSWORT

Nun habe ich beim googlen ein Beispiel gefunden, der es so gemacht hat

Code:
<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
	<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1525:XE</property>
    <property name="hibernate.connection.username">derUSERNAME</property>
    <property name="hibernate.connection.password">dasPASSWORT</property>

    <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

    <property name="connection.pool_size">10</property>
	
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
	
    <property name="current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>

Ich würde das so erstmal einfach übernehmen. Fragen habe ich aber nun: dieser oracle.jdbc.driver.OracleDriver unter driver_class, ist der shcon vorhanden oder muss ich den runterladen, wenn ja wo?
Meine Connection muss ich unter connection.url angeben. aber was bedeutet da das XE? ist das die SID? Also bei mir:
<property name="hibernate.connection.url">jdbc😱racle:thin😡oracleDBHost:1234:08ed15</property>
stimmt das? Wenn das XE im Beispiel oben nicht die SID ist, wo gebe ich die dann an?

Danke für die Hilfe, werden danach sicher noch mehr Fragen kommen 🙂

danke
 
JDBC - Oracle FAQ

JDBC/UCP Download Page

Oracle ist mit den Versionen und der generellen Installation etwas komplizierter als MySQL oder so möchte ich meinen,
wenn du schon nichmal weißt oder selber nachschauen kannst was als JDBC-Treiber benötigt wird,
dann ist das ohne lokale Hilfe eigentlich nicht einzurichten, ich selber hätte zumindest bei mir auch Zweifel

das XE bezieht sich auf
Tnsnames.ora - Oracle FAQ
 
Hallo SlaterB,
danke für deine Antwort.

Ich habe von JDBC/UCP Download Page das ojdbc6.jar geladen.

Meine confic:
Code:
<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
		<property name="connection.url">jdbc:oracle:thin:@oracleDBHost:1234:08ed15</property>
        <property name="connection.username">derUSERNAME</property>
        <property name="connection.password">dasPASSWORT</property>
        
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="connection.pool_size">10</property>
        
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
 
 		<property name="show_sql">true</property>
 		
        <property name="current_session_context_class">thread</property>
 
        <mapping class="package.User"/>
    </session-factory>
</hibernate-configuration>

Datenbank erstellen und etwas speichern funktioniert (nach Behebung verschiedenster Fehler) nun.

Danke für die Hilfe.


Wie ich die Verbindung aufbaue habe ich aus einem anderen kurz Tutorial. Da mir dies bischen suspekt ist will ich es kurz zeigen und würde dann um eure Meinung/Erfahrung fragen.

Also, es gibt im Moment eine Entity User mit userID (wird generiert), Name und Passwort. Die Klasse dazu poste ich nicht, dürfte ja eh meist gleich sein.

Dann habe ich eine Klasse für die Erstellung der Session:
Java:
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import de.bennyn.example.hibernate.VO_User;
 
 
public class HibernateUtil
{
    private static SessionFactory sessionFactory;
 
    static
    {
        try
        {
            sessionFactory = new AnnotationConfiguration()
                                .configure()
                                .buildSessionFactory();
        }
        catch (RuntimeException ex)
        {
            System.out.println(ex.getMessage());            
        }
    }
 
    public static SessionFactory getSessionFactory()
    {
        return sessionFactory;
    }
}
bei buildSessionFactory kommt hier auch, dass diese Funktion deprecated ist.

Dise test Methode wird beim Starten der Seite aufgerufen. Den Inhalt habe ich auch aus dem Tutorial:
Java:
public void testDB()
{
        User newUser = new User();
        newUser.setUsername("Benny");
        newUser.setPassword("asd");
 
        SessionFactory sf       = HibernateUtil.getSessionFactory();
        Session session         = null;
        Transaction transaction = null;
 
        // Neuen Benutzer in Datenbank speichern:
        try
        {
            session             = sf.getCurrentSession();
            transaction         = session.beginTransaction();
            session.save(newUser);
            transaction.commit();
        }
        catch (Exception e)
        {
            // rollback(transaction);
            System.out.println(e.getMessage());
        }
}
Bei diesem Vorgehen wird weder die session noch die sessionfactory geschlossen. Eine Session-Factory wird aber nicht bei jedem Neuaufruf der Seite erstellt.

Wie macht man am geschicktesten die Datenbank-SessionFactory/-Session Verwaltung in einer Web-Anwendung?

Danke
 
meiner Ansicht/ Erfahrung nach kann die Factory ruhig länger bestehen, auch Tage/ Wochen,
eine neue Session pro Request ist weniger dramatisch,
denkbar wäre aber auch hier vielleicht aus Sparsamkeit seltenere Neustellungen, bis hin zu einem Pool aktuell freier Sessions,

wenn man dann noch an Dinge wie OpenSessionInView denkt, kann man mit dem Thema Bücher füllen,
da gibts schon viele Ideen und Bedenken und Gründe und blahblah
 

Zurück
Oben