zoukankan      html  css  js  c++  java
  • hibernate 出错 集合

    Lazy="false"反而出错

    错误信息:

    “System.Configuration.ConfigurationErrorsException”类型的异常在 Spring.Core.DLL 中发生,但未在用户代码中进行处理

    其他信息: Error creating context '/hotelmis': Could not find the dialect in the configuration

          从错误信息看到是配置文件出了问题,出现dialect的地方只有一个


        <property name="HibernateProperties">
          <dictionary>
            <entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
            <entry key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect"/>
            <entry key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
            <entry key="hibernate.show_sql" value="true"/>
          </dictionary>
        </property>

          这种写法是用在NHiberate12版本中的,如果在NHiberate21版本中应该改为:

          <entry key="dialect" value="NHibernate.Dialect.MsSql2005Dialect"/>

    错误信息:

          命名空间“NHibernate”中不存在类型或命名空间名称“Expression”(是缺少程序集引用吗?) 

          命名空间出错:使用Criteria查询数据时用,NHiberate12是在NHibernate.Expression中,而NHiberate21是在NHibernate.Criterion中。

    错误信息:

    “Spring.Data.NHibernate.HibernateSystemException”类型的异常在 Spring.Data.NHibernate21.DLL 中发生,但未在用户代码中进行处理

    其他信息: Invalid Cast (check your mapping for property type mismatches); setter of DBLayer.MAP.Accredit.RoleFunction

          这个错误光从字面上看是RoleFunction的映射文件中的内容跟类定义的属性不匹配引起的,实际上不是。是一对多关系中一方设置多方集合中的属性Lazy="false"引起的。因为使用了,所以Lazy="false"反而出错,其中具体是什么原因,本人没有深入的去了解。

        <set name="RoleFunctions" table="AC_Role_Function_Test" inverse="false" lazy="true" cascade="all-delete-orphan">
          <key column="RoleID" />
          <one-to-many class="DBLayer.MAP.Accredit.RoleFunction,DBLayer" />
        </set>

    Nhibernate 要求model实体类对于lazy="true" ,字段属性前需要加 virtual

    sqlserver2005和oracle10g的hibernate.cfg.xml如何配置?
    A:sqlserver2005配置如下
    <!-- NHibernate sqlserver2005配置-->
    <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
      <session-factory name="db1">
        <!-- properties -->
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
        <property name="connection.connection_string">
          Server=.;initial catalog=NhibernateTest;User Id=sa;Password=sa
        </property>
        <property name="use_outer_join">true</property>
        <property name="use_proxy_validator">true</property>
        <!--<property name="show_sql">false</property>-->
        <!--<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>-->
        <!-- mapping files -->
        <mapping assembly="Kang.Model" />
      </session-factory>
    </hibernate-configuration>

    Oracle10g配置如下:
    <!-- NHibernate Oracle10g配置-->
    <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
      <session-factory name="db1">
        <!-- properties -->
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver&lt</property>
        <property name="dialect">NHibernate.Dialect.Oracle9Dialect&lt</property>
        <property name="connection.connection_string">
          data source=KANGSHI;User ID=huobj;Password=huobj
        </property>
        <property name="use_outer_join">true</property>
        <property name="use_proxy_validator">true</property>
        <!--<property name="show_sql">false</property>-->
        <!--<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>-->
        <!-- mapping files -->
        <mapping assembly="Kang.Model" />
      </session-factory>
    </hibernate-configuration>


    Q:无法将类型为“NHibernate.Dialect.MsSqlCeDialect”的对象强制转换为类型“NHibernate.Driver.IDriver”。
    A:当切换数据库时,相应的connection.driver_class属性是需要调整
      oracle10g是NHibernate.Driver.OracleClientDriver
      MsSql2005是NHibernate.Driver.SqlClientDriver

    Q:could not execute query
    A:总的原则是,Nhibernate查询还是遵守sql原规则的。
    1 字段名称不对,
    2 字段格式不对,注意日期、数字和字符
    3&lt;property type="string" length="50" name="RoleName" column="[RoleName]" /&gt;
    oracle必须把RoleName的[]去掉。而sqlsever去不用去[]都行。
     

    Q:The type System.Int32 can not be assigned to a property of type System.String setter of Kang.Model.Entities.USR_UserInfo.LoginID
    A: 主键LoginID原定义的是int ,应该改成string

    Q:Invalid Cast (check your mapping for property type mismatches); setter of Kang.Model.Entities.USR_UserInfo
    A:length="80" 必须小于数据库表中字段的长度。另外,就是实体类中属性类的类型要和nhibernate-mapping 中的type同。

    因为是在调用GetAll()方法是报的错,那我就一个属性一个属性的去掉,来调用这个方法,看究竟是哪个属性的类型不匹配。最终定位到一个枚举类型,在 实体类里定义该属性为枚举类型,但是在映射文件中使用的却是String类型,因此报错。因为枚举类型可以以String类型在数据库中存储,因此将实体 类中该类型改为String,编译运行,好了。

    Q:数据库中的Date、DateTime和TimeStamp类型区别?
    A:
    DATETIME, DATE和TIMESTAMP类型是相关的。本文描述他们的特征,他们是如何类似的而又不同的。
    DATETIME 类型用在你需要同时包含日期和时间信息的值时。MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。(“支持”意味着尽管更早的值可能工作,但不能保证他们可以。)
    DATE类型用在你仅需要日期值时,没有时间部分。MySQL检索并且以'YYYY-MM-DD'格式显示DATE值,支持的范围是'1000-01-01'到'9999-12-31'。
    TIMESTAMP列类型提供一种类型,你可以使用它自动地用当前的日期和时间标记INSERT或UPDATE的操作。如果你有多个TIMESTAMP列,只有第一个自动更新。

    SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。
    滴答数必须介于 DateTime.MinValue.Ticks 和 DateTime.MaxValue.Ticks 之间。
    参数名: ticks
    A:实体类中这样定义就ok了  private DateTime _CreateDate = new DateTime(2009 - 9 - 9);

     
       Q:有的哥们这么写,但是问题是麻烦。
                 var whitelist = new[] { "UserId", "UserName", "UserParssord", "UserMail" };
                    UpdateModel(user, whitelist);
                    uService.UpdateUserInfo(user);
                    return RedirectToAction("Index");
    A:     可以这样写
                   model = bll.GetModel(id);
                    UpdateModel(model);
                    bll.UpdateData(model);
                    return RedirectToAction("Index")

    父子表关联映射 ============================================== 
    Q: 用户代码未处理 NHibernate.PropertyAccessException
      Message="Invalid Cast (check your mapping for property type mismatches); setter of Kang.Model.Entities.USR_UserInfo"
      Source="Kang.NHibernateHelper"
      A:<!--多对一关系:Users属于一个Role-->
      <many-to-one name="RoleID" column="RoleID" not-null="true" class="Kang.Model.Entities.RoleInfo" foreign-key="FK_RoleUsers" />

       <!--一对多关系:Role有一个或多个Users-->
        <set name="Users" table="`USR_UserInfo`" generic="true" inverse="true">
          <key column="RoleInfo" foreign-key="FK_RoleUsers"/>
          <one-to-many class="Kang.Model.Entities.USR_UserInfo"/>
        </set>
     
     Q:Duplicate property mapping of RoleID found in Kang.Model.Entities.USR_UserInfo
     A:有重复的属性定义。属性对象化,页面调用显示时可以再调用属性的属性,如:model.RoleID.RoleName

    Q:Could not initialize proxy - the owning Session is disconnected
     A:对于父子关联表,把lazy="false"

  • 相关阅读:
    树莓派4 (1)一键配置
    Android编码学习之Fragment
    android编码学习
    自动化中app支持schema跳转
    jenkins持续集成
    测试环境运维文章集锦
    HTML5 data-* 自定义属性
    了解一下JavaScript的未来——ECMAScript5
    ECMAScript5的其它新特性
    ECMAScript5 Array新增方法
  • 原文地址:https://www.cnblogs.com/kting/p/4028237.html
Copyright © 2011-2022 走看看