2016-06-16 4 views
0

Ich bin eine Anwendung von Hibernate 4.3.6.Final zu 5.0.9.Final und später zu 5.2.0.Final migrieren. Derzeit habe ich ein Problem mit HQL-Abfragen, die keine voll qualifizierten Namen verwenden. Die Anwendung verwendet die Konfigurationsdatei hibernate.cfg.xml in Kombination mit den Mapping-Dateien hbm.xml für jede Objektklasse. Annotationen werden nur in Klassen verwendet, die auch die Hibernate-Suche verwenden. Zur Datenauswahl verwendet die Anwendung HQL-Abfragen, nur wenige Abfragen sind Kriterienabfragen.HQL Abfrage Probleme nach Hibernate Migration von 4.3.6.Final zu 5.0.9.Final

Die folgende HQL Abfrage funktioniert perfekt in 4.3.6:

Organization temp = (Organization) session.createQuery("FROM Organization o WHERE o.pid = "+pid).setMaxResults(1).uniqueResult(); 

In 5.0.9.Final erhalte ich die folgende Ausnahme:

java.lang.IllegalArgumentException: org.hibernate.QueryException: in expected: o [FROM Organization o WHERE o.pid = 5] 

Wenn ich die Abfrage in der folgenden Art und Weise ändern Alles ist in Ordnung:

Organization temp = (Organization) session.createQuery("FROM at.nettania.dev.ntacadmin.core.organization.Organization o WHERE o.pid = "+pid).setMaxResults(1).uniqueResult(); 

Allerdings hat die Anwendung Hunderte von Abfragen, die alle geschrieben werden Auf die gleiche Weise und in der Dokumentation verwenden sie nicht den vollständig qualifizierten Klassennamen. Daher könnte ich ein Konfigurationsproblem haben, ich hoffe jemand kann mir einen Rat geben.

Organization.hbm.xml Datei:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="at.nettania.dev.ntacadmin.core.organization.Organization" table="NTACADMIN_ORGANIZATION"> 
     <id name="pid" type="int"> 
      <column name="PID" /> 
      <generator class="native" /> 
     </id> 
     <property name="creationDate" type="java.util.Date"> 
      <column name="CREATIONDATE" /> 
     </property> 
     <property name="changeDate" type="java.util.Date"> 
      <column name="CHANGEDATE" /> 
     </property> 
     <property name="locale" type="java.util.Locale"> 
      <column name="LOCALE" /> 
     </property> 
     <property name="timeZoneId" type="java.lang.String"> 
      <column name="TIMEZONEID" /> 
     </property> 
     <property name="deleted" type="boolean"> 
      <column name="DELETED" /> 
     </property> 
     <property name="enabled" type="boolean"> 
      <column name="ENABLED" /> 
     </property> 
     <property name="name" type="java.lang.String"> 
      <column name="NAME" /> 
     </property> 
     <property name="shortcut" type="java.lang.String"> 
      <column name="SHORTCUT" /> 
     </property> 
</hibernate-mapping> 

Das ist, wie sich die wichtigsten Einstellungen der aktuellen hibernate.cfg.xml Datei wie folgt aussieht:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
             "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory name=""> 
    <!-- 
    <property name="hibernate.c3p0.min_size">5</property> 
    <property name="hibernate.c3p0.max_size">20</property> 
    <property name="hibernate.c3p0.timeout">300</property> 
    <property name="hibernate.c3p0.max_statements">50</property> 
    <property name="hibernate.c3p0.idle_test_period">3000</property> 
    --> 

    <!-- 
    Database configuration 
    --> 
    <property name="connection.url">jdbc:mysql://localhost/testing</property> 
    <property name="connection.username">root</property> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="connection.password“>****</property> 
    <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 
    <property name="hibernate.jdbc.batch_size">0</property> 
    <property name="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</property> 
    <!-- thread is the short name for org.hibernate.context.ThreadLocalSessionContext and let Hibernate bind the session automatically to the thread --> 
    <property name="current_session_context_class">thread</property> 
    <!-- this will show us all sql statements --> 
    <property name="hibernate.show_sql">false</property> 
    <!-- automatic creation of tables --> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property> 
    <!-- JDBC Batch Size --> 
    <property name="hibernate.jdbc.batch_size">20</property> 

    <!-- Organization mappings --> 
    <mapping class="at.nettania.dev.ntacadmin.core.organization.Organization" resource="at/nettania/dev/ntacadmin/core/organization/Organization.hbm.xml"/> 

</session-factory> 
</hibernate-configuration> 

Danke, Florian

+0

können Sie die gesamte XML-Datei einfügen? Ich hatte nie Probleme, den absoluten Paketpfad der Entität zu setzen – Apostolos

+0

Ich habe nur die vollständige hbm.xml und hibernate.cfg.xml zum ursprünglichen Beitrag hinzugefügt. Danke für Ihre Hilfe. – Florian

Antwort

2

Ich denke, Sie müssen das Klassenattribut aus Mapping-Tag entfernen. Ressource ist bei der Verwendung von XML-Dateien und Klasse bei der Verwendung von Anmerkungen.

+0

Vielen Dank für diesen Hinweis, das war der Grund, interessant, dass dies vor Hibernate 5.x.x nicht zu einem Problem geführt hat. – Florian

Verwandte Themen