2011-03-11 89 views
6

目前我們在將應用程序從Hibernate 3.2.5遷移到3.6.1時遇到了很多問題。將Hibernate 3.2.5遷移到3.6

,我們所面臨的第一個錯誤是:

重度:無效的列名稱btn_name「。雖然btn_name沒有映射到哪裏。實際的映射是btnName。

這裏是我的映射文件

<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> 

關注com.sampleproject.client.beansdm.metadata.uicontrols.InputControl連接子類的映射有一個名爲btnName場。它的3.2.5版本正常工作,但當我將其更改爲較新的休眠版本時,它會停止響應。

是否有任何可能的jar衝突?

請幫忙。

感謝你, 的問候,從3.5遷移到3.6時

回答

5

Hibernate Version Comparison指南指出:

然而,對於仍在使用的hbm.xml 用戶,你應該知道,我們選擇了 使用 org.hibernate.cfg.EJB3NamingStrategy 在AnnotationConfigration使用舊 org.hibernate.cfg.DefaultNamingStrategy H的替代 在配置上使用。 這可能會導致命名不匹配; 一個 已知的地方,這是一個問題是 如果你依靠的命名策略, 默認情況下,協會 (許多一對多和 元素的集合)表的名稱。如果你發現自己 在這種情況下,你可以告訴 休眠通過調用 配置#setNamingStrategy和 傳遞 org.hibernate.cfg.DefaultNamingStrategy#INSTANCE

使用傳統 org.hibernate.cfg.DefaultNamingStrategy

NamingStrategy接口定義了幾個方法,如String foreignKeyColumnName(String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName)用於確定由EJB3NamingStrategy實現的列和關聯的名稱。我建議你在EJB3NamingStrategy類中看看這些方法的實現,看看它是如何將屬性名稱轉換爲列名稱的。

它看起來像hibernate現在將下劃線添加到它希望列名通過一個這些轉換在數據庫中,並且當它無法在您的數據庫中找到結果列名'btn_name'時感到不安。

+0

尼斯答案...我可以創建自己的EJB3NamingStrategy通過擴展它,重寫方法和提供的地方來了解hibernate。 – 2011-03-12 07:36:14

+0

什麼應該是我的最後一步?我有近190張桌子,幾乎不可能將HBM轉換爲所有人的註釋。我很感謝你的時間和努力,謝謝你。 – 2011-03-12 07:55:35

+0

您不必從hbm更改爲註釋以使用不同的NamingStrategy。請參閱http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/session-configuration。html#configuration-namingstrategy瞭解如何實現新的NamingStrategy的詳細信息。你甚至可以擴展EJB3NamingStrategy,只是改變導致悲傷的命名。我還會在你的配置文件中打開show_sql選項,這樣你就可以看到hibernate使用什麼命令來訪問你的db。 – 2011-03-16 13:23:39