Bonjour,
J'ai intégré récemment un projet utilisant massivement Hibernate (
v3.1.2).
Mon problème est de parvenir à faire fonctionner de nouveau un traitement batch s'appuyant sur Hibernate, qui utilisait une connexion "classique" via driver thin/URL/user/password et qui doit maintenant passer par une authentification externe via driver OCI, sans info supplémentaire transmise.
A titre indicatif, le projet comporte plusieurs autres batchs "simples", que j'ai dû modifier (avec succès) pour utiliser la connexion à Oracle en mode externe :
- l'URL est donc devenue
jdbc:oracle:oci@ (au lieu de
jdbc:oracle:thin@machine:port:SID)
- et les valeurs passées pour le username et le password sont maintenant "" (chaine vide).
Ces batchs n'utilisent pas Hibernate : les outils mis en oeuvre sont la OracleDataSource d'Oracle et le QueryRunner issu du package Jakarta commons-dbutils. Pour ces "petits" batchs, cela fonctionne parfaitement, sans retouche dans le code.
Je suis donc certain que la configuration Oracle et les droits utilisateur Unix sont corrects, et que mon problème avec le batch hibernate ne vient pas de là.
En effet, j'ai tenté sans succès de reproduire cette méthode avec le fichier hibernate.cfg.xml :
Quote:
<property name="hibernate.connection.username"></property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.connection.url">jdbc:oracle:oci:@</property>
J'obtiens alors l'erreur suivante :
Quote:
org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:91)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:79)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:363)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:122)
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:125)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1309)
at com.maboite.infra.application.hibernate.composant.HibernateAG.beginTransaction(HibernateAG.java:43)
... 4 more
Caused by: java.sql.SQLException: Exception d'E/S: The Network Adapter could not establish the connection
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at java.sql.DriverManager.getConnection(DriverManager.java:539)
at java.sql.DriverManager.getConnection(DriverManager.java:158)
at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:110)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:360)
... 9 more
En cherchant sur le Net et dans ces forums, je ne suis pas parvenu à trouver d'exemple indiquant qu'on puisse utiliser l'OS authentication d'Oracle avec Hibernate (mais je n'ai pas vu écrit non plus noir sur blanc "pas d'OS authentication avec Hibernate")
==> Ma question est donc triple :
1) existe-t-il une possibilité d'appliquer le principe de l'OS authentication Oracle avec Hibernate ? (si la réponse est "oui, avec le driver Machin de chez MachinSoftware", c'est sans espoir, on a déjà éclaté le budget)
2) sinon, sachant qu'avec des outils moins sophistiqués j'arrive à utiliser l'authentification externe Oracle dans mes "petits" batchs,
existe-t-il une possibilité d'ouvrir la connexion Oracle d'abord, puis de contraindre Hibernate à utiliser cette connexion ?
3) deux classes apparaissent dans la pile d'appel : T4CConnection et T4CDriverExtension. Elles appartiennent au package ojdbc et paraissent dédiées aux connexions avec les drivers type 4. Or, moi je veux passer par OCI qui est un driver type 2. Je suppose donc qu'un paramètre du hibernate.cfg.xml est incorrect, sans doute le driver_class.
Quelqu'un peut-il m'indiquer comment forcer l'utilisation du driver de type 2 par Hibernate ?
Merci d'avance pour vos réponses,
G4rF