2011-03-11 14 views
6

Actualmente nos enfrentamos a un gran problema al migrar nuestra aplicación de Hibernate 3.2.5 a 3.6.1.Migración de Hibernate 3.2.5 a 3.6

El primer error que nos enfrentamos es:

GRAVES: nombre de columna no válido 'btn_name'. Aunque btn_name no se asigna en ningún lugar. La asignación real es btnName.

Aquí está mi archivo de asignación

<hibernate-mapping> 
    <class abstract="true" name="com.sampleproject.client.beansdm.metadata.Component" 
     table="component_master"> 
     <id column="metadata_id" name="id" type="long"> 
      <generator class="native" /> 
     </id> 
     <property column="metadata_type" name="type" type="string" /> 
     <property name="createdDateTime" column="created_date" type="date" 
      update="false"></property> 
     <property name="version" type="string" column="version_id"></property> 
     <property name="currentDate" type="date" column="curr_date"></property> 
     <property name="currentIP" type="string" column="current_ip"></property> 
     <many-to-one name="currentUser" 
      class="com.sampleproject.client.beansdm.domain.common.User" cascade="refresh" 
      column="current_user_id"></many-to-one> 
     <property name="latestDate" type="date" column="latest_date"></property> 
     <property name="latestIP" type="string" column="latest_ip"></property> 
     <many-to-one name="latestUser" 
      class="com.sampleproject.client.beansdm.domain.common.User" cascade="refresh" 
      column="latest_user"></many-to-one> 
     <property name="recordStatus" type="boolean" column="record_status"></property> 
     <property name="portal" type="string" column="portal"></property> 
     <many-to-one cascade="refresh,save-update,delete" 
      class="com.sampleproject.client.beansdm.metadata.Component" column="md_id" 
      name="metadata" not-null="false" /> 

     <joined-subclass 
      name="com.sampleproject.client.beansdm.metadata.uicontrols.UIControl" 
      table="ui_control_master"> 
      <key column="ui_control_id" /> 
      <property column="display_name" name="displayText" /> 
      <property column="help_text" name="helpText" /> 
      <property column="info_text" name="informativeText" /> 
      <property column="rows" name="rows" type="integer" /> 
      <property column="cols" name="cols" type="integer" /> 
      <property column="btnName" name="btnName" type="string" /> 
      <property name="version" type="string" column="version_id"></property> 
      <property name="currentDate" type="date" column="curr_date"></property> 
      <property name="currentIP" type="string" column="current_ip"></property> 
      <many-to-one name="currentUser" 
       class="com.sampleproject.client.beansdm.domain.common.User" cascade="refresh" 
       column="current_user_id"></many-to-one> 
      <property name="latestDate" type="date" column="latest_date"></property> 
      <property name="latestIP" type="string" column="latest_ip"></property> 
      <many-to-one name="latestUser" 
       class="com.sampleproject.client.beansdm.domain.common.User" cascade="refresh" 
       column="latest_user"></many-to-one> 
      <property name="recordStatus" type="boolean" column="record_status"></property> 
      <property name="portal" type="string" column="portal"></property> 
      <property name="readOnly" type="boolean" column="read_only"/> 

      <joined-subclass 
       name="com.sampleproject.client.beansdm.metadata.uicontrols.InputControl" 
       table="input_control_master" lazy="true"> 
       <key column="input_control_id" /> 
       <property column="default_value" name="defaultValue" 
        not-null="false" /> 
       <property column="is_fk" name="fk" /> 
       <property column="validatable" name="validatable" /> 
       <property column="violatable" name="violatable" /> 
       <property name="isRequired" column="is_required"></property> 
       <property name="ruleType" 
        type="com.sampleproject.facadeimplementation.util1.UserEnumRuleType" 
        column="rule_type"></property> 
       <property name="fileType" column="file_type"></property> 
       <property name="maxFileSize" column="max_file_size" type="integer"></property> 
       <property name="precision" column="input_precision" type="integer"></property> 
       <property name="maxLength" column="maxlength" type="integer"></property> 
       <property name="minLength" column="minlength" type="integer"></property> 
       <property name="dateFormatType" column="dateformat" 
        type="com.sampleproject.facadeimplementation.util1.UserEnumDateFormatType"></property> 
       <property name="specialCharAllow" column="isspecialcharallow"></property> 
       <property name="specialChars" column="specialchars" type="string"></property> 
       <property name="dateType" 
        type="com.sampleproject.facadeimplementation.util1.UserEnumDateType" 
        column="date_type"></property> 
       <property name="minDate" column="mindate" type="string"></property> 
       <property name="maxDate" column="maxdate" type="string"></property> 
       <property name="inspection" column="inspection" type="boolean"></property> 
       <property name="values" column="default_values" type="string"></property> 
       <property name="targetNames" column="target_names" type="string"></property> 
       <!-- 
        <many-to-one cascade="save-update, delete" 
        class="com.sampleproject.client.beansdm.metadata.Column" 
        column="target_column_id" name="targetColumn" /> 
       --> 
       <property name="targetColumn" column="target_column" type="string"></property> 
       <property name="templateName" column="template_name" type="string"></property> 
       <!-- 
        <bag name="targetColumnNames" cascade="save-update" 
        table="input_possible_columns_map"> <key 
        column="input_control_id"></key> <element column="column_name" 
        not-null="true" type="string" /> </bag> 
       --> 
       <!--<bag name="possibleValues" cascade="save-update" table="input_possible_values_map"> 
        <key column="input_control_id" /> 
        <many-to-many 
         class="com.sampleproject.client.beansdm.metadata.uicontrols.PossibleValue" 
         column="value" /> 
       </bag> 
       --><property name="seperator" column="seperator" type="string" /> 
       <many-to-one name="refTable" cascade="refresh" 
        class="com.sampleproject.client.beansdm.metadata.Table" column="ref_table_id" lazy="false"> 
       </many-to-one> 
       <many-to-one name="targetTable" cascade="refresh" 
        class="com.sampleproject.client.beansdm.metadata.Table" column="target_table_id" /> 
       <property name="version" type="string" column="version_id"></property> 
       <property name="currentDate" type="date" column="curr_date"></property> 
       <property name="currentIP" type="string" column="current_ip"></property> 
       <many-to-one name="currentUser" 
        class="com.sampleproject.client.beansdm.domain.common.User" cascade="refresh" 
        column="current_user_id"></many-to-one> 
       <property name="latestDate" type="date" column="latest_date"></property> 
       <property name="latestIP" type="string" column="latest_ip"></property> 
       <many-to-one name="latestUser" 
        class="com.sampleproject.client.beansdm.domain.common.User" cascade="refresh" 
        column="latest_user"></many-to-one> 
       <property name="recordStatus" type="boolean" column="record_status"></property> 
       <property name="portal" type="string" column="portal"></property> 
       <many-to-one name="linkedColumn" cascade="refresh" 
        class="com.sampleproject.client.beansdm.metadata.Column" column="linked_column_name"> 
       </many-to-one> 
       <many-to-one name="linkedMasterColumn" cascade="refresh" 
        class="com.sampleproject.client.beansdm.metadata.Column" column="linked_master_column"> 
       </many-to-one> 
       <many-to-one name="linkedTable" cascade="refresh" 
        class="com.sampleproject.client.beansdm.metadata.Table" column="linked_master_id"> 
       </many-to-one> 
      </joined-subclass> 
     </joined-subclass> 
    </class> 
</hibernate-mapping> 

Centrarse en com.sampleproject.client.beansdm.metadata.uicontrols.InputControl mapeo sumado-subclase hay un campo denominado btnName. Funciona bien con la versión 3.2.5 pero cuando lo cambié a una versión más nueva de hibernación deja de responder.

¿Hay posibles conflictos de tarro?

Por favor ayuda.

dando las gracias al Saludos,

Respuesta

5

Los Hibernate Version Comparison estados de guía cuando se pasa de 3.5 a 3.6 que:

Sin embargo, para los usuarios que todavía utilizan hbm.xml Debe tener en cuenta que elegimos para uso del org.hibernate.cfg.EJB3NamingStrategy utiliza en lugar AnnotationConfigration de la mayor org.hibernate.cfg.DefaultNamingStrategy h istóricamente utilizado en la Configuración. Esto puede causar nomenclaturas de nombres; uno conocido lugar donde esto es un problema es si se basan en la estrategia de nombres para por defecto el nombre de una asociación mesa (muchos-a-muchos y colecciones de elementos ). Si usted se encuentra en esta situación, se puede decir Hibernate para utilizar el legado org.hibernate.cfg.DefaultNamingStrategy llamando configuración # setNamingStrategy y pasándolo org.hibernate.cfg.DefaultNamingStrategy # INSTANCIA

La interfaz NamingStrategy define varios métodos como String foreignKeyColumnName(String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName) utilizados para determinar los nombres de las columnas y asociaciones implementadas por EJB3NamingStrategy. Le sugiero que mire la implementación de estos métodos en la clase EJB3NamingStrategy y vea cómo está transformando los nombres de propiedad en nombres de columna.

Parece que hibernate ahora está agregando los caracteres de subrayado a lo que espera que el nombre de columna esté en el DB mediante estas transformaciones, y se altera cuando no puede encontrar el nombre de columna resultante 'btn_name' en su base de datos.

+0

Agradable Respuesta ... ¿Puedo crear mi propia EJB3NamingStrategy ampliándola y reemplazando métodos y proporcionando algún lugar para entender bien la hibernación? –

+0

¿Cuál debería ser mi paso final? Tengo casi 190 tablas y es casi imposible convertir hbm en anotaciones para todas. Aprecio tu tiempo y esfuerzo gracias. –

+0

No tiene que cambiar de hbm a las anotaciones para usar una estrategia de nombres diferente. Ver http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/session-configuration.html # configuration-namingstrategy para detalles sobre cómo implementar una nueva estrategia de naming. Incluso podría extender la estrategia EJB3NamingStrategy simplemente cambiando los nombres que están causando dolor. También activaría la opción show_sql en su archivo de configuración para que pueda ver exactamente qué comandos está usando hibernate para acceder a su base de datos. –