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 查找最接近的元素 题解
    二分练习题5 二分法求函数的零点 题解
    二分练习题3 查找小于x的最大元素 题解
    二分练习题2 查找大于等于x的最小元素 题解
    二分练习题1 查找元素 题解
    code forces 1176 D. Recover it!
    code forces 1173 B. Nauuo and Chess
    code forces 1173 C. Nauuo and Cards
    吴恩达深度学习课程笔记-15
    吴恩达深度学习课程笔记-14
  • 原文地址:https://www.cnblogs.com/kting/p/4028237.html
Copyright © 2011-2022 走看看