• NHibernate.HibernateException:“Unable to locate persister for the entity named 'Domain.Entity.LeaseUser'.


    在使用NHiberanter,创建一个session上下文,进行语句执行时,出现了标题所示错误。控制台调用代码如下:

     public  static void Main(string[] args)
            {
                //NHibernateProfiler程序分析初始化
                //HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize();
                ISessionFactory factory = new Configuration().Configure().BuildSessionFactory();
                 ISession session = factory.OpenSession();
                using (ITransaction rs = session.BeginTransaction()) 
                {
                    var pm = session.Get<LeaseUser>(154143);//出现错误
                    var _model = session.QueryOver<LeaseUser>().Where(x => x.UserName=="陶*林").List();
                    var sModel = session.CreateSQLQuery("select * from LEASE_USER where user_name=:num").AddEntity(typeof(LeaseUser))
                        .SetParameter("num", "包磊");

    通过session的get方法,获取一个指定实体,提示持久化对象没有在配置文件中加载到。配置文件如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!-- 
     3 This template was written to work with NHibernate.Test.
     4 Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it 
     5 for your own use before compile tests in VisualStudio.
     6 -->
     7 <!-- This is the System.Data.OracleClient.dll provider for Oracle from MS -->
     8 <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2">
     9     <session-factory name="NHibernate.Test">
    10         <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
    11         <property name="connection.connection_string">
    12             User ID=admin;Password=admin001;Data Source=127.0.0.1/orcl
    13         </property>
    14         <property name="show_sql">true</property>
    15         <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
    16         <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    18     </session-factory>
    19 </hibernate-configuration>

    诱因一:该配置时直接从下载的Nh包中的oracle.cfg.xml移植过来的,通过查询资料,发现少了一行:<mapping assembly="Domain"/>,该mapping需要添加在session-factory的最后位置,其目的是加载持久化对象的映射文件的所在程序集:

    1 <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
    2         <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    3         <mapping assembly="Domain"/><!--用于加载实体映射文件所在的程序集-->
    4     </session-factory>

    诱因二:与Fluent Nhibernate混肴了。使用如下代码片段加载hibernate配置文件,它会去查找配置文件mapping配置的程序集下的所有xml映射文件,因为使用了Fluent Nhibernate的map映射,所以是查找不出对应的xml,也即持久化对象的映射未在配置中查找到:

    1 ISessionFactory factory = new Configuration().Configure().BuildSessionFactory();

    备忘:

       一。向项目中添加指定的数据库xx.cfg.xml文件的时候,需要统一修改名称为:hibernate.cfg.xml

      二。hibernate.cfg.xml文件属性->复制到输入目录->始终复制或如果较新则复制

      三。直接引入的数据库对应的cfg.xml文件,是没有mapping节点的。但这个是必不可少的属性节点。

      四。如果没有实现三,还可以让NHibernate自动到程序集加载所有嵌入式资源xml映射文件,如下代码:

    1 Configuration cfg = new Configuration()
    2     .AddAssembly( "Domain" );

      五。如果没有实现一,也可以使用如下代码,添加一个不同的XML配置文件

    1 ISessionFactory sf = new Configuration()
    2     .Configure("/path/to/config.cfg.xml")
    3     .BuildSessionFactory();

       六。NHibernate中的一级缓存,是个字典值。字典的key就是主键值。如果key值相同,则认为是同一个对象。如果映射结构里没有配置主键值,NHibernate就无法管理session的缓存,就会报异常。

  • 相关阅读:
    [算法说明]SAP HANA PAL 指数平滑算法说明 沧海
    [Step By Step]SAP HANA PAL演绎推理算法Lite Aprior实现LITEAPRIORIRULE 沧海
    [PAL规范]SAP HANA PAL K分值硬聚类算法KMeans编程规范KMEANS 沧海
    [Step By Step]SAP HANA PAL K分值硬聚类算法KMeans Validated实现案例VALIDATEKMEANS 沧海
    SAP HANA AFL插件库升级后之前生成的存储过程升级方法(PAL升级方法) 沧海
    [PAL规范]SAP HANA PAL单指数平滑编程规范 沧海
    [PAL规范]SAP HANA PAL演绎推理算法Lite Apriori编程规范LITEAPRIORIRULE 沧海
    [Step By Step]SAP HANA PAL K分值硬聚类算法KMeans实现KMEANS 沧海
    [Step By Step]SAP HANA PAL Time Series单指数平滑算法SINGLESMOOTH(Single Exponential Smoothing) 沧海
    [PAL规范]SAP HANA PAL K分值硬聚类算法KMeans Validated编程规范VALIDATEKMEANS 沧海
  • 原文地址:https://www.cnblogs.com/king-tao/p/13359844.html
Copyright © 2020-2023  润新知