Gibt es einen Hibernate-Dialekt für Oracle Database 11g? Oder sollte ich den mit Hibernate gelieferten org.hibernate.dialect.Oracle10gDialect
verwenden?
Verwenden Sie den Oracle 10g-Dialekt. Für aktuelle JDBC-Treiber ist außerdem Hibernate 3.3.2+ erforderlich (die interne Klassenstruktur wurde geändert - die Symptome werden über eine abstrakte Klasse laut).
Der Dialekt von Oracle 11g ist identisch mit Oracle 10g (org.hibernate.dialect.Oracle10gDialect). Quelle: http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/session-configuration.html#configuration-optional-dialects
Laut unterstützten Datenbanken wird Oracle 11g nicht offiziell unterstützt. Ich glaube jedoch, dass Sie mit org.hibernate.dialect.OracleDialect
keine Probleme haben sollten.
Wir hatten ein Problem mit der (veralteten) Dialektdatenbank org.hibernate.dialect.Oracledialect
und der Oracle 11g-Datenbank im Modus hibernate.hbm2ddl.auto = validate
.
Mit diesem Dialekt konnte Hibernate die Sequenzen nicht finden (weil die Implementierung der getQuerySequencesString()
-Methode diese Abfrage zurückgibt:
"select sequence_name from user_sequences;"
für die die Ausführung ein leeres Ergebnis aus der Datenbank zurückgibt).
Die Verwendung des Dialekts org.hibernate.dialect.Oracle9iDialect
oder höher löst das Problem aufgrund einer anderen Implementierung der getQuerySequencesString()
-Methode:
"select sequence_name from all_sequences union select synonym_name from all_synonyms us, all_sequences asq where asq.sequence_name = us.table_name and asq.sequence_owner = us.table_owner;"
das gibt stattdessen alle Sequenzen zurück, wenn sie ausgeführt werden.
Zumindest bei EclipseLink unterscheiden sich 10g und 11g. Seit 11g wird die Verwendung des first_rows-Hinweises für Paginierungsabfragen nicht empfohlen.
Siehe "Ist es möglich, jpa-Hinweise für eine bestimmte Abfrage zu deaktivieren" . Eine solche Abfrage sollte in 11g nicht verwendet werden.
SELECT * FROM (
SELECT /*+ FIRST_ROWS */ a.*, ROWNUM rnum FROM (
SELECT * FROM TABLES INCLUDING JOINS, ORDERING, etc.) a
WHERE ROWNUM <= 10 )
WHERE rnum > 0;
Es kann aber auch andere Nuancen geben.
Wenn Sie WL 10 verwenden, verwenden Sie Folgendes:
org.hibernate.dialect.Oracle10gDialect
verwenden Sie nur org.hibernate.dialect.OracleDialect Entfernen Sie 10 g, 9 usw.