随笔-81  评论-910  文章-0  trackbacks-56
我会尽我所能帮大家解决问题,和大家共同进步!
posted on 2006-08-03 12:43 DDL 阅读(5688) 评论(83)  编辑 收藏 网摘 所属分类: NHibernate

评论:
#1楼 2006-08-04 20:57 | superstar      
请问一个nhibernate的简单的问题就是删除操作的时候
Delete(实体对象)的时候,实体对象只set一个id值能否删除,希望能帮解答一下,谢谢!

  回复  引用  查看    
#2楼[楼主] 2006-08-07 10:36 | DDL      
@ superstar
先用Load方法读取此对象,然后删除对象.
你可以把这个操作封装成一个方法

  回复  引用  查看    
#3楼 2006-08-07 15:06 | superstar      
哦,这样就没有必要用这种方法了,还不如用hql语句的方法删除,之所以想用实体对象删除是为了不需要再load一次浪费性能,楼上既然这样说还是用hql好
  回复  引用  查看    
#4楼 2006-08-08 19:46 | dino2006[未注册用户]
我在新增一条记录的时候,老是报错说:could not save object 或者是could not insert [DAL.VO.RegisterFile#20060808001] ,
DAL.VO.RegisterFile 是我的一个SET/GET 的类来的,20060808001是我插入的主健值,
这个到底是怎么回事呀?

  回复  引用    
#5楼[楼主] 2006-08-09 09:49 | DDL      
建议你先按NHibernate的调试技巧和Log4Net配置里面说的调试看看,仔细检查下日志文件记录的Sql,并试着单独运行此Sql.

  回复  引用  查看    
#6楼 2006-08-09 16:52 | nasa[未注册用户]
请问多对多的搜索是怎么样做的. 我现在作的一个项目卡在这个问题上了. 我的msn:nasa_wz@hotmail.com
  回复  引用    
#7楼[楼主] 2006-08-09 17:59 | DDL      
@nasa
这两天问一对多,多对多的人很多,我这几天就会写篇随笔做详细的介绍。

  回复  引用  查看    
#8楼 2006-08-15 09:43 | xinghuang[未注册用户]
我现在在做一个项目,数据库有好几百张表,采用方法是在启动时NHibernate一次性全部加载实体类进行初始化映射,但要非常久的时间,不知道有什么办法可以提高初始化速度。
  回复  引用    
#9楼[楼主] 2006-08-16 17:58 | DDL      
@xinghuang
http://www.cnblogs.com/renrenqq/archive/2006/08/02/466056.html">http://www.cnblogs.com/renrenqq/archive/2006/08/02/466056.html

采用在代码中使用Configuration.AddClass方法逐一加载实体类的方法,按使用到模块或者类进行加载.

可以用Configuration.ClassMappings检查类是否已加载。

  回复  引用  查看    
#10楼 2006-08-30 16:04 | gothing[未注册用户]
我在Web Service下使用NHibernate遇到的问题:

我把NHibernate放到Web Service下,某些表之间有关联,数据库的映射文件包含Bag元素;Client端只使用Web Service;出现问题是:
System.InvalidOperationException: Type 'NHibernate.Collection.Bag, NHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=154fdcb44c4484fc' does not implement IXmlSerializable interface therefore can not proceed with serialization.

如果把映射文件的Bag元素删掉,相应的去掉cs代码中获取IList的代码,则可以通过;

如果Client不使用Web Service,而是直接与NHibernate通讯,映射部分不删掉也没问题;

以上不是最好的解决办法。为何会出现这个问题呢,希望大家回复。

  回复  引用    
#11楼 2006-08-30 16:48 | 若有若雾      
在分层结构的WEB表示层中,使用数据层的数据库数据是多元的,
有的只使用查询表的一个值,有的使用两个,或者三个,四个

在分层结构中,一般数据库的表数据都被封装在 业务实体中,通过业务逻辑层返回实体,给WEB表示层使用
如果不管表示层是使用一个数据段,还是三个数据段,都返回一个完整的实体,对于查询字段较多的表,性能上应该是不一样的

我想请教的就是,如何使用一种方法 对数据表的查询使用进行统一
我想过建立 一个视图 实体,对应 表示层中使用的数据
比如一个表用户表 有 5 个字段 id name age address birth (这里只是简单列举,如果在项目中字段是很多的)

表示层的一个应用 只需根据 id 返回 name age , 那么建立数据视图实体 对应这两个字段
表示层的另一个应用 需根据 id 返回 name age address ,那么建立 视图实体 对应这三个字段

我只是想过,不知道这样是否可以提高性能,但这样 产生的代码 太多了,如果对于一个字段有几十个的表,又有十几种不同的应用的话,那么要建立十几中的视图 实体



想请教高手 ,在实际项目中如何在分层结构里解决这种问题的,谢谢!
ps:我是做dotnet web方面的开发

期待回答,指导!

  回复  引用  查看    
#12楼[楼主] 2006-08-31 09:38 | DDL      
@若有若雾

对于大多数情况来说,取一个对象的所有值对性能影响不是很大的.而且如果用上NH的缓存机制,对象从数据库中取得会缓存在内存中.

对于表中有大字段比如(text,image)的时候,可以考虑使用多个实体映射一张表的方法.一个实体映射表中非大字段的其他字段,一个实体映射表中的大字段和主键.然后只有需要用到大对象时才读取后一个实体.(NH现在暂时不支持字段的延迟加载,延迟加载可以让字段在受到访问时才读取,等NH支持延迟加载后可以使用单个实体了)

对于性能要求比较高的地方,或者是明显的分字段访问(例如某一个实体类总是只访问其中几个字段,而其他字段一般不访问,或者是到另外一处才被访问).你可以考虑把一个表映射成多个实体.

但是注意不要把表划分成多个实体.这样一是不好充分的利用缓存.对于开发者来说也是很恐怖的,因为对象实在太多.而且从面向对象的角度考虑你会觉得很别扭.



  回复  引用  查看    
#13楼[楼主] 2006-08-31 12:34 | DDL      
@gothing
我没有发现此问题.我写了Web Service测试,并未发现此问题

  回复  引用  查看    
#14楼 2006-08-31 16:41 | gothing[未注册用户]
非常感谢DDL的回复!
可我始终不知道错误在哪里。有人说是IList之类的东西不能序列化,可那时CodeSmith自动生成的代码;而且不用Web Service就没问题,难道不用Web Service就没有序列化了吗?调用Web Service时是否要序列化?

能否拜读一下您的测试代码,非常感激!我的Email:gothing@163.com。

  回复  引用    
#15楼 2006-09-08 21:05 | hai4[未注册用户]
in expected: <end-of-text> (possibly an invalid or unmapped class name was used in the query) [from V_SYS_Users]
每次执行到query.List()时就报错!!!

  回复  引用    
#16楼 2006-09-14 18:02 | msnetc[匿名][未注册用户]
我刚了解。
请问 我想用NHibernate作一个商业网站,请问NHibernate 成熟吗?
NHibernate 支持调用存储过程吗?
那个版本的NHibernate 比较成熟?

  回复  引用    
#17楼[楼主] 2006-09-15 10:43 | DDL      
@msnetc
NHibernate已经很成熟了
建议你使用1.02版本

  回复  引用  查看    
#18楼[楼主] 2006-09-15 11:09 | DDL      
@hai4
检查你是否查询了没有正确映射的实体

  回复  引用  查看    
#19楼 2006-09-22 14:47 | HAPPY[匿名][未注册用户]
现有一个主表 BillMain 和一个子表
BillMain表有以下4列:
mainID (主键,自增长列)、BillCode、CreateMain、Description
BillSub表有以下3列
mainID、subID、Description
其中BillSub表的 mainID和subID是联合主键
-------------------------------------------
配置文件如下:
<class name="NHBDemo.BillMain,NHBDemo" table="BillMain">
<id name="mainID" column="mainID">
<generator class="identity" />
</id>
<property name="BillCode"/>
<property name="CreateMan" />
<property name="Description" />
<bag name="BillSubs" cascade="all" inverse="true" lazy="true">
<key column="mainID" />
<one-to-many class="NHBDemo.BillSub,NHBDemo"/>
</bag>
</class>
--------------------------------------------------------
<class name="NHBDemo.BillSub,NHBDemo" table="BillSub">
<composite-id >
<key-property name="subID" />
<key-many-to-one name="mainID" column="mainID" class="NHBDemo.BillMain,NHBDemo"/>
</composite-id>
<property name="Description"/>
</class>
-----------------------------------------------------
在保存时无论先保存子表还是先保存主表都报
could not update: [NHBDemo.BillSub#NHBDemo.BillSub]

  回复  引用    
#20楼 2006-09-25 14:45 | 桃子[未注册用户]
我写一个双向的one-to-many的例子测试TestCreate时老是报
Unknown entity class: NHibernate.CRUDTest.Entity.AddressEntity
为什么???

  回复  引用    
#21楼[楼主] 2006-09-26 10:38 | DDL      
@HAPPY
建议你不要使用联合主键,BillSub建立单独的组建.
@桃子
检查你的实体是否正确影射,检查你的.hbm是否嵌入资源

  回复  引用  查看    
#22楼 2006-10-09 22:27 | Young.J[未注册用户]
刚开始学NHibernate,照着quick start试了一次,我把代码copy的,但允许是报Configuration cfg = new Configuration();这句有错,错误信息是“NHibernate.Cfg.Configuration”的类型初始值设定项引发异常。
不知道你们有没有遇到过,我可是一步一步ctrl+c的,不知道哪地方出问题了,请高手指点!

  回复  引用    
#23楼 2006-10-20 10:48 | WideWeide      
最近需要实现一个数据导入导出的功能,原本想直接把对象序列化成xml文件,然后反序列化用Hibernate保存,问题搞定。

在实际运行时发现带有集合属性的对象无法序列化,目前的思路是把手工读取对象的属性放到xml文件,然后读取之,工作量较大。且做到通用非常不易。

不知道DDL兄可有简单的处理办法?

  回复  引用  查看    
#24楼 2006-10-24 16:10 | 何芳[未注册用户]
第一次接触NHibernate,知道它是由hibernate开发工具启发而来的基于.NET的关系型数据库的对象持久化类库,可以通过第三方工具来生成表对应关系XML文件及相关代码。
我的问题是,为什么NHibernate没有自带的工具,就如同.net三层架构开发的时候,有一个数据访问辅助类,SqlHelper,却没有相关的生成工具;要使用代码生成器,就必须使用第三方生成器的辅助基类。

  回复  引用    
#25楼 2006-10-26 16:33 | yellowslow[未注册用户]
数据库中有几行数据,我取出来到内存中,再对他进行删除第一行,再追加一行,并修改某行数据后,怎么存到库里?调用SaveOrUpdate方法并不能把删除的信息删除掉,我要怎么操作呢?
  回复  引用    
#26楼 2006-10-27 10:04 | WideWeide      
请教下:下面的基类是否已经有人实现了,在哪找到?
=============
NHibernate实现自操作的实体类
|
非鱼软件工作室
Friday, April 07. 2006
NHibernate实现自操作的实体类
作者 Jason Cui 在 NHibernate 在 05:47
NHibernate

对NHibernate操作Access的研究暂告一段落,近期的主要精力放在开发另一套系统上了,使用NHibernate+Sql Server。有了前面的经验,总算是做起来快一些了。

偶尔在一篇Blog上看到了个将Nhibernate的实体类写成自操作的类的方法,想想自己真是愚蠢。当初看到NHibernate教程的时候,看到那些实体里只有变量和属性的声明,当时也觉得奇怪,为什么一个方法也没有,不过却从来没有去考虑过怎样把方法加进去。至少最基本的Save, Update, Delete应该是自操作的,这样看上去才容易一些,添加新的类也更容易。以前的那个程序表比较少,所有的数据操作都在一个DBClass里面,每个表至少需要4到5个操作方式,加起来也是相当可观的量了。每次查找修改一个方法都要找一阵子。而把方法分散到每个人自已的实体类里,修改起来也容易的多了。

对于基本的Insert,Update,Delete,都是针对某个实体的,所以可以做为实例方法,而所有的实体类的方法完全相同,于是抽象出一个基类,放入Save,Update和Delete方法。在基类中并没有直接访问NHibernate,而是又加了一层包装,DBHelper类。应用 Singleton模式,DBHelper类只能实例化一次。基类的这三个方法都很简单,只是调用一句db.Save(this),而db就是 DBHelper的实例,它里面也只有一个调用:打开session, session.Save(o), 关闭session。NHibernate会自动分辨传入的对象的类型并保存它。另外两个方法也是一样的。

但是对于Select就不同了。在我们Select之前,我们还没有得到这个类的实例,那么我们就没有理由将它作为实例方法,而应该是类的静态方法。一开始我将这个方法也放入基类,结果发现C#不允许重写基类中的静态方法,而且在这个静态方法中也无法得到当前的类名和类型。于是将所有的Load方法放入子类中作为静态方法,但是这样又不能访问基类里的成员db了。在这里搞了很久,最后下了一记狠招,将DBHelper中所有的成员和方法声明成静态的,包括构造函数。在静态构造函数中检查Configuration变量是否已有值,如果没有就初始化它。

然后将基类中的三个方法的调用改成类方法调用,去除成员db。然后在所有的子类中添加Load,使用类方法调用DBHelper中的Load,并传入自己的类型。这样的方法基本上也有三个,LoadByID, LoadAll和DeleteByID。

至此,终于可以使用所有的自处理的类了。你可以这样得到一个已有值:

User user = User.LoadByID(100);

或者这样新建一个值:

User user = new User();

//设置变量的值。

user.Save();

  回复  引用  查看    
#27楼 2006-11-09 14:21 | 余冰[匿名]
今天上午在MSN群里和大家讨论了下,NHB和ADO.NET并发事务处理的问题。中午做了个Demo出来,实现了一部分功能。但是,却有个问题。使用ISessionFactoryImplementor打开一个工厂后。给相应的一个Session传了一个IDbConnection对象,结果,Session在Flush的时候报错。提示无法插入对象。想问下,有没有什么更好的办法解决这个并发事务呢?
  回复  引用    
#28楼 2006-11-09 20:27 | 风魂[匿名][未注册用户]
在使用一对多的双向关联时遇上两个问题:
public class WorkShift
{
pulibc int WorkShiftID {get{return m_workShiftID};set{m_workShiftID=value;}}
public IList TimeSpans{get{return m_timeSpans;} set{m_timeSpans=value;}}

private int m_workShiftID;
private IList m_timeSpans;
}

public class TimeSpan
{
public int TimeSpanID{get{return m_timeSpanID;} set{m_timeSpanID=value;}}
public WorkShift WorkShift{get{return m_workShift;} set{m_workShift=value;}}

private int m_timeSpanID;
private WorkShift m_workShift;
}

// WorkShift 的 xml
<bag name="TimeSpans" cascade="all" inverse="true" lazy="false">
<key column="ID"/>
<one-to-many class="HR.WorkShiftTimeSpan, HR"/>
</bag>

// TimeSpan 的 xml
<many-to-one name="WorkShift" column="WorkShiftID" class="HR.WorkShift, HR" />


问题一:很多例子都在主表的配置上都是用<set>,而我用<set>的话话,会提示“指定的转换无效”,查了一下,和在保存时会有一个对集合转ISet的操作,所以报错。不是说.net下面的IList、IDictionary都支持吗?后来改成<bag>就可以了。也不知<bag>和<set>有什么差别

问题二:用<bag>虽然可以保存了。我写入一笔主档WorkShift,对应有五个TimeSpan,数据库里都写成功了,但用session.Load(typeof(WorkShift), workShiftID);时,TimeSpan始终只加载了第一笔,没有五笔都加载。。。。。郁闷!!!!!!!!!

  回复  引用    
#29楼 2006-11-10 10:09 | 菜鸟[匿名][未注册用户]
大哥给各思路吧:
---------------------
三张表
[school] 学校id: schoid ;学校名称:schoname
[class] 班级id:classid ;班级名称:classname ;班级信息:classinfo
[student] 学生id:stuid ;学生名: stuname ; 学生分数:mark(int);
学期:term(1,2,3,4)
假设就一门课,四个学期
统计出(order by schoname,classname ,classinfo,stuname, mark ) :
学校名称, 名称, 班级信息, 学生 , 平均分(mark)
schoname classname classinfo stuname mark
-----------------------
请问该怎么解决呢,主要是HQL语句的写法

  回复  引用    
#30楼 2006-11-10 10:27 | 菜鸟[匿名][未注册用户]
大哥给各思路吧-2:
--------------------- -
表结构为:
tabcurr: id,name
tabhist: id,name
表tabcurr和表tabhist的结构完全一样。
tabcurr 表达的 当前正在使用的记录 ;
tabhist 表达的 是历史信息.
//统计出两张表的内容(order by name)
id name
1 3
.. ...
-----------------------
可以用原生SQL 或者HQL 解决都行的.大哥,救救欧吧.!

  回复  引用    
#31楼 2006-12-01 10:58 | JSHYHZJ[未注册用户]
public class User
{
private Int64 id;

public Int64 Id
{
get { return id; }
set { id = value; }
}
private String userName;

public String UserName
{
get { return userName; }
set { userName = value; }
}
private Group properTo;

public Group ProperTo
{
get { return properTo; }
set { properTo = value; }
}
}

User.hbm.xml
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"
assembly="grid"
namespace="grid">
<class name="User" table="TUser">
<id name="Id" column="Id" type="Int64" >
<generator class="identity" />
</id>
<property name="UserName" column= "UserName" type="String" length="20"/>
<!--<property name="ProperTo" column= "ProperTo" type="Int64"/>-->

<many-to-one name="ProperTo" class="Group" column="ProperTo" unique="true"/>
</class>

</hibernate-mapping>


Group.hbm.xml
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"
assembly="grid"
namespace="grid">
<class name="Group" table="TGroup">
<id name="Id" column="Id" type="Int64" >
<generator class="identity" />
</id>
<property name="GroupName" column= "GroupName" type="String" length="20"/>
</class>

</hibernate-mapping>



ISession ssn = hbmCfg.SessionFactory.OpenSession();
User user;
try
{
user = ssn.Get(typeof(User), fUserId) as User;
lUserName.Text = user.UserName;
lGroupName.Text = user.ProperTo.GroupName;
//=====================================
//为什么ProperTo的值都是空的? 如何手工装入ProperTo?
//=====================================
}
catch (Exception dde)
{
log.ExceptionLog("", dde);
}
finally
{
ssn.Close();
}


  回复  引用    
#32楼 2006-12-15 01:51 | jack[匿名][未注册用户]
知道要怎么连mysql数据库么.
  回复  引用    
#33楼 2006-12-22 11:20 | witer666[匿名]
请问NHibernate在VS2005中的ASP.NET2.0中如何用呢,我试过很我次都不成功,提示这个:
Could not configure datastore from file E:\NHibernateDemo\users.hbm.xml

请帮我看一下,谢谢

  回复  引用    
#34楼 2006-12-22 16:01 | wwwxuehu[未注册用户]
未能找到元素“urn:nhibernate-mapping-2.0:hibernate-mapping”的架构信息
NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
行 34: //cfg.AddAssembly(Assembly.GetExecutingAssembly());
行 35: cfg.AddXmlFile(System.Web.HttpContext.Current.Server.MapPath(@"~\App_Code") + @"\Customer.hbm.xml");
行 36: //cfg.Configure(System.Web.HttpContext.Current.Server.MapPath("~") + @"\hibernate.cfg.xml");
行 37: //cfg.AddAssembly();


这个问题怎么解决?

  回复  引用    
#35楼 2007-02-05 19:27 | rooping[未注册用户]
<session-factory> element was not found in the configuration file?
你好,请问这个问题怎么解决 ?
环境asp2.0

我的配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.0">
<session-factory name="Domain">
<!-- SQL Server 2000/2005-->
<property name="connection.connection_string">server=BL08;database=PermissionBase;uid=sa;pwd=sa</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="show_sql">true</property>
<property name="use_outer_join">true</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider,NHibernate.Caches.SysCache</property>
<property name="cache.use_query_cache">false</property>
<property name="relativeExpiration">120</property>
<mapping assembly="Domain" />
</session-factory>
</hibernate-configuration>

  回复  引用    
#36楼 2007-03-07 09:43 | chenyq2008[未注册用户]
请问NHibernate如何实现many-to-many的关联查询?
例如User和Group是many-to-many的关系,用中间表UserGroups关联,如果要查询一个Group中有多少User,用NHibernate如何写代码?

  回复  引用    
#37楼 2007-03-21 16:14 | wuda8[未注册用户]
我想知道,怎样通过NHibernate将返回的集合通过dataGridView显示出来?
  回复  引用    
#38楼 2007-03-22 00:32 | ni[未注册用户]
请问一下,出现以下情况,到底是哪处地方配置错了?
错误:could not update: [ChatRoom.Entity.UserInfo#1][SQL: UPDATE UserInfo SET NickName = ?, UserName = ?, Password = ?, Birthday = ?, Gender = ?, LastLoginTime = ?, LastLoginIP = ?, Status = ?, Type = ?, FaceUrl = ?, Remark = ? WHERE UserId = ?]

谢谢!期待中......

  回复  引用    
#39楼 2007-03-22 00:40 | ni[未注册用户]
请问一下,出现以下情况,到底是哪处地方配置错了?
错误:could not update: [ChatRoom.Entity.UserInfo#1][SQL: UPDATE UserInfo SET NickName = ?, UserName = ?, Password = ?, Birthday = ?, Gender = ?, LastLoginTime = ?, LastLoginIP = ?, Status = ?, Type = ?, FaceUrl = ?, Remark = ? WHERE UserId = ?]

谢谢!期待中......

  回复  引用    
#40楼 2007-04-10 10:58 | 郑[未注册用户]
我在使用NHIBERNATE分页时遇到下列问题,我想找到Nhibernate分页的方法.SQL分页已经解决了。但是,基于NHIBERNATE的对象分页还没找到,不知道大家明白我的意思不,针对对象分页,那么查询条件中写的则是对象的属性,而不是真实的字段名字。
我目前遇到的问题是,在使用select count()的时候NHIBERNATE并不支持。不知道NHIBERNATE是怎么回事情和hibernate有所不同,下面是我的代码,请高手指正。

  回复  引用    
#41楼 2007-04-10 11:01 | 郑[未注册用户]
public class QueryHandler
{
private static QueryHandler _instance = new QueryHandler();
private static readonly ILog log = LogManager.GetLogger(typeof(QueryHandler));
public static QueryHandler Instance
{
get { return QueryHandler._instance; }
}
public QueryHandler() { }

public IPage QueryByPage(int pageNumber, int pageSize,
ArrayList valuesList, String hql)
{

if (hql == null || hql.Equals(""))
return null;
IPage page = null;
ISession session = null;
try {
session = NHibernateHelper.GetInstance().GetSession();
int total = GetTotalCount(session, hql, valuesList);
ArrayList querylist =new ArrayList(Query(session, hql, valuesList, pageNumber, pageSize));
page = new NHibernatePage(querylist, total, pageNumber, pageSize);
}
catch (Exception e) {
log.Error("分页查询时发生数据库错误, hql:" + hql + "\r\n错误:" + e);
}
finally {
if (session != null)
session.Close();
}
return page;
}
private int GetTotalCount(ISession session, String hql, ArrayList valuesList){
int count = 0;
int sql_orderby = hql.IndexOf("order by");
int sql_from=hql.ToLower().IndexOf("from");
int sql_select=hql.ToLower().IndexOf("select");
int sql_field=hql.ToLower().IndexOf(",");
if(sql_from==-1) sql_from=0;
if(sql_select==-1) sql_select=0;
else{sql_select=sql_select+6;}
if (sql_field>=sql_from){
sql_field=0;
}
else if(sql_field==-1){
sql_field=0;
}

String fieldName=(hql.Substring(sql_select,sql_field).Trim().Length==0
)?"*":hql.Substring(sql_select,sql_field);
StringBuilder countStr = new StringBuilder("select count(1) ");
if (sql_orderby > 0)
countStr.Append(hql.Substring(sql_from, sql_orderby - sql_from));
else
countStr.Append(hql.Substring(sql_from, hql.Length - sql_from));

try {
IQuery query = session.CreateQuery(countStr.ToString());
for (int i = 0; i < valuesList.Count; i++) {
query.SetParameter(i, valuesList[i]);
}
IEnumerator e=query.List().GetEnumerator();
e.MoveNext();
count=System.Convert.ToInt32(e.Current);


return count;
} catch (Exception e) {
log.Error("查找数据总数时数据库查询错误" + e);
throw new DAOException(e.Message);
}
}

private ArrayList Query(ISession session, String hql, ArrayList valuesList,
int pageNo, int pageSize) {
try {
IQuery query = session.CreateQuery(hql);
for (int i = 0; i < valuesList.Count; i++) {
query.SetParameter(i, valuesList[i]);
}
query.SetFirstResult((pageNo - 1) * pageSize);
query.SetMaxResults(pageSize);

return new ArrayList(query.List());
} catch (Exception e) {
log.Error("查找数据时数据库查询错误" + e);
throw new DAOException(e.Message);
}
}


public ArrayList QueryAll(String hql, ArrayList valuesList) {
ISession session = null;
try {
session = NHibernateHelper.GetInstance().GetSession();
IQuery query = session.CreateQuery(hql);
for (int i = 0; i < valuesList.Count; i++) {
query.SetParameter(i, valuesList[i]);
}
return new ArrayList(query.List());
} catch (Exception e) {
log.Error("查找全部记录时数据库查询错误" + e);
throw new DAOException(e.Message);
} finally {
if (session != null)
session.Close();
}
}

}

  回复  引用    
#42楼 2007-04-11 17:03 | jingxin[未注册用户]
大家有没遇到在Save 的时候 明明已经付了值的。。。 却提示错误;不能将空值插入表的
{"无法将 NULL 值插入列 'ID',表 'SweaterDB.dbo.Area';该列不允许空值。INSERT 失败。" }

  回复  引用    
#43楼 2007-04-12 21:22 | 郑[未注册用户]
你如果是由程序指定必须这样写,这样就应该没问题.
<id name="Id" column="id">
<!-- The Author must have the same identifier as the Person -->
<generator class="assigned"/>
</id>
重点:
<generator class="assigned"/>

  回复  引用    
#44楼 2007-04-15 14:31 | JAMES[未注册用户]
@wwwxuehu
你是怎么解决的

  回复  引用    
#45楼 2007-04-15 14:31 | JAMES[未注册用户]
怎么没有人解决啊!
  回复  引用    
#46楼 2007-05-11 11:48 | wolf[未注册用户]
你好,我想问一下,如果我的项目中用到了多个数据库,那怎么在配置文件中配置多个连接字符串呢?
  回复  引用    
#47楼 2007-05-12 15:45 | popexiong[未注册用户]
我想用NHibernate 1.0.4.0 连接 sql 2005, 应该怎样做, 可以说的详细一点吗,谢谢!
  回复  引用    
#48楼 2007-05-14 10:14 | wgm[未注册用户]
有没有高性能的Nhibernate 分页方法?目前的分页方式很不适合海量数据分页。
  回复  引用    
#49楼 2007-05-14 12:38 | LISA[未注册用户]
好心的大大!
本人初次接觸Hibernate,將此功能套用在ASP.NET的環境中的以VB.NET的程式測試,TRACE時出現如下的訊息,不知這要如何解決,問題出在那裡,可否請幫幫忙好嗎?

找不到項目 'urn:nhibernate-mapping-2.0:hibernate-mapping' 的結構描述資訊。

  回复  引用    
#51楼 2007-05-20 13:46 | LISA[未注册用户]
問題獲得解決.非常感謝!
  回复  引用    
#52楼 2007-06-04 09:38 | ztwz[未注册用户]
D:\Inetpub\wwwroot\NHibernate\ClassLibrary1\Class1.cs(4): 类型或命名空间名称“Cfg”在类或命名空间“NHibernate”中不存在(是否缺少程序集引用?)
我添加的是using NHibernate.Cfg这个命名空间
可我以添加了NHibernate.dll的引用啦,还要添加什么东东呀。请问这个问题要怎么解决3Q

  回复  引用    
#53楼 2007-06-04 13:45 | Jason[未注册用户]
如下所示的代码,如果不是运行在WebService中,没有问题,但是通过WebService调用,则提示:“必须在 Iesi.Collections.ISet 上实现默认访问器,因为它继承自 ICollection” ,希望有经验的朋友指点一下!!
[WebMethod]
[XmlInclude(typeof(Customer))]
public IList GetCustomers()
{
using (ISession session = GetFactory().OpenSession())
{
ITransaction tr = session.BeginTransaction();
IList customers = session.CreateCriteria(typeof(Customer))
.List();
return customers;
}
}

  回复  引用    
#54楼 2007-06-14 10:13 | Kelin[未注册用户]
在您的代码生成器和其他几种NHibernate的代码生成器生成的代码中,都有"MarkAsDeleted", "IsDelete", "IsChanged"这样的方法和属性, 这些方法和属性是用来干吗的? 我粗略看了NHibernate的源码, 似乎里面也没有动态调用这些方法和属性的地方, 烦请指教:(
  回复  引用    
#55楼 2007-08-16 15:52 | rik[未注册用户]
初级入门问题.我用Mygeneration模板生成的代码
所有的类型都是nukown这是怎么回事?
db.AddInParameter(dbCommand, "commentID", Unknown, commentID);
db.AddInParameter(dbCommand, "Board", Unknown, Board);
db.AddInParameter(dbCommand, "commentTitle", Unknown, commentTitle);
db.AddInParameter(dbCommand, "userName", Unknown, userName);
db.AddInParameter(dbCommand, "IP", Unknown, IP);
db.AddInParameter(dbCommand, "commentDateTime", Unknown, commentDateTime);
db.AddInParameter(dbCommand, "content", Unknown, content);
db.AddInParameter(dbCommand, "commentParentID", Unknown, commentParentID);
db.AddInParameter(dbCommand, "top", Unknown, top);
db.AddInParameter(dbCommand, "agree", Unknown, agree);
db.AddInParameter(dbCommand, "disagree", Unknown, disagree);
db.AddInParameter(dbCommand, "display", Unknown, display);
db.AddInParameter(dbCommand, "reply", Unknown, reply);

  回复  引用    
#56楼 2007-08-16 16:24 | rik[未注册用户]
我的邮箱tenvick@163.com
  回复  引用    
#57楼 2007-08-23 15:25 | sa[未注册用户]
我用了这样的代码在page_load中,目的是每次都加入一条新的数据,可是nh却一直更新这条数据而不产生新的,不知为何:
protected void Page_load(......)
{
user u = new user();
u.name = Guid.NewGuid.Tostring();
u.pass="123";
session.Save(u)
}

  回复  引用    
#58楼 2007-08-25 19:40 | sdf[未注册用户]
在配置时,遇到一个异常
NHibernate.MappingException: Unknown entity class: NHibernateProject.Domain.Account
好奇怪,怎么会出现这种情况呢,我以前用过Hibernate,所以应该不会出现什么问题的,不知道大家有不有遇到这个问题呢?是不是我还有什么细节问题没有处理好呢,急啊,希望大家帮我一下

  回复  引用    
#59楼 2007-09-03 11:56 | tancky[未注册用户]
模版中的中文注释或者说明在生成的文件中用VS打开将会是乱码,后来通过查看文件格式为UTF-8编码,而通过VS生成的文件都是ANSI编码方式,不知道如何在MG上生成的文件改为ANSI编码的方式?
  回复  引用    
#60楼 2007-09-05 22:54 | yutou[未注册用户]
请问如何利用nhibernate实现批量更新?
例如提交DataTable中的若干条记录

  回复  引用    
#61楼 2007-09-06 22:23 | 阿辉[未注册用户]
使用NHBERNATE后如何,能够很容易就获得实体对象,并通过它进行数据库的操作.但是,.NET的表现层控件如gridVIER,datalist的数据源如何指向一个对象集合???请高手指点.
  回复  引用    
#62楼 2007-10-09 14:30 | cc#[未注册用户]
现在的 NHibernate 最新的是什么版本???
我怎么在这找不到啊
这块有很久没更新了吧???

  回复  引用    
#63楼 2007-10-11 10:32 | Xsword_cn[未注册用户]
在.net下的O/R M中只有nhibernate吗?还有没有其他选择?有什么优缺点?谢谢
  回复  引用    
#64楼 2007-11-01 23:25 | RandyInfo[未注册用户]
有没有nhibernate最新版本1.20,要有发一份给好吗?谢谢
  回复  引用    
#65楼 2007-11-28 13:19 | Aplia[未注册用户]
请忙看一下这个问题:不知道为什么,保存时,@p5外键值为什么总为空.

有两个表,是主从表,Department为主表,主键为DepartmentID,从表为Employee,主键和外键分别为EmployeeID,DepartmentID


测试代码:
transaction = session.BeginTransaction();

CEmployee employee = new CEmployee();
employee.FirstName = "Aplia";
employee.FullName = "Aplia.China";
employee.Salary = 8888;
employee.Mobile = "1388888888";

CDepartment dep = new CDepartment();
dep.DepartmentName = "Microsoft Office";
dep.Employees.Add(employee);
session.Save(dep);

映谢表:

Department:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
namespace="BussinessCore"
assembly="BussinessCore" xmlns="urn:nhibernate-mapping-2.2">
<class
name="CDepartment"
table="DEPARTMENT">
<id
name="ID"
column="DEPARTMENTID"
type="Guid"
length="16"
unsaved-value="00000000-0000-0000-0000-000000000000">
<generator
class="guid.comb" />
</id>
<property
name="DepartmentName"
type="string"
column="DepName"
length="32"
not-null="true" />
<bag name="Employees" cascade="all" inverse="true">
<key column="DEPARTMENTID"/>
<one-to-many class="CEmployee" />
</bag>
</class>
</hibernate-mapping>

Employee:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
namespace="BussinessCore"
assembly="BussinessCore" xmlns="urn:nhibernate-mapping-2.2">
<class
name="CEmployee"
table="EMPLOYEE">
<id
name="ID"
column="EMPLOYEEID"
type="Guid"
length="16"
unsaved-value="00000000-0000-0000-0000-000000000000">
<generator
class="guid.comb" />
</id>
<property
name="DepID"
type="Guid"
column="DEPARTMENTID"
length="16" />
<property
name="FirstName"
type="string"
column="FIRSTNAME"
length="32" />
<property
name="FullName"
type="string"
column="FULLNAME"
length="32" />
<property
name="Salary"
type="int"
column="SALARY" />
<property
name="Mobile"
type="string"
column="MOBILE"
length="32" />
<many-to-one
name="Department"
column="DEPARTMENTID"
foreign-key="DEPARTMENTID" />
</class>
</hibernate-mapping>

  回复  引用    
#66楼 2007-11-28 13:19 | Aplia[未注册用户]
执行结果如下:

NHibernate: INSERT INTO DEPARTMENT (DepName, DEPARTMENTID) VALUES (@p0, @p1); @p
0 = 'Microsoft Office', @p1 = '8f5b00e0-911e-4053-b3c2-99f400d863be'
NHibernate: INSERT INTO EMPLOYEE (DEPARTMENTID, FIRSTNAME, FULLNAME, SALARY, MOB
ILE, DEPARTMENTID, EMPLOYEEID) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6); @p0 =
'8accf4af-c9e4-4e09-afa4-99f400d863c8', @p1 = 'Aplia', @p2 = 'Aplia.China', @p3
= '8000', @p4 = '1388888888', @p5 = '', @p6 = '8accf4af-c9e4-4e09-afa4-99f400d8
63c8'

未处理的异常: NHibernate.ADOException: could not insert: [BussinessCore.CEmploy
ee#8accf4af-c9e4-4e09-afa4-99f400d863c8][SQL: INSERT INTO EMPLOYEE (DEPARTMENTID
, FIRSTNAME, FULLNAME, SALARY, MOBILE, DEPARTMENTID, EMPLOYEEID) VALUES (?, ?, ?
, ?, ?, ?, ?)] ---> FirebirdSql.Data.FirebirdClient.FbException: Dynamic SQL Err
or
SQL error code = -206
No message for error code 336397210 found.
No message for error code 336397208 found. ---> FirebirdSql.Data.Common.IscExcep
tion: 引发类型为“FirebirdSql.Data.Common.IscException”的异常。
在 FirebirdSql.Data.Client.Gds.GdsConnection.ReadStatusVector()
在 FirebirdSql.Data.Client.Gds.GdsConnection.ReadResponse()
在 FirebirdSql.Data.Client.Gds.GdsDatabase.ReadResponse()
在 FirebirdSql.Data.Client.Gds.GdsStatement.Prepare(String commandText)
在 FirebirdSql.Data.FirebirdClient.FbCommand.Prepare(Boolean returnsSet)
在 FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteCommand(CommandBehavior b
ehavior, Boolean returnsSet)
在 FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteNonQuery()
--- 内部异常堆栈跟踪的结尾 ---
在 FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteNonQuery()
在 NHibernate.Impl.NonBatchingBatcher.AddToBatch(IExpectation expectation)
在 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Obje
ct[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessio
nImplementor session)
--- 内部异常堆栈跟踪的结尾 ---
在 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Obje
ct[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessio
nImplementor session)
在 NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Obje
ct[] fields, Object obj, ISessionImplementor session)
在 NHibernate.Impl.ScheduledInsertion.Execute()
在 NHibernate.Impl.SessionImpl.Execute(IExecutable executable)
在 NHibernate.Impl.SessionImpl.ExecuteAll(IList list)
在 NHibernate.Impl.SessionImpl.Execute()
在 NHibernate.Impl.SessionImpl.Flush()
在 NHibernate.Transaction.AdoTransaction.Commit()
在 testBussiness.CManager.testDepartment() 位置 F:\MyDocuments\Nhibernate\Hum
an Resource Management\part2\testBussiness\CManager.cs:行号 73
在 testBussiness.Program.Main(String[] args) 位置 F:\MyDocuments\Nhibernate\H
uman Resource Management\part2\testBussiness\Program.cs:行号 17

  回复  引用    
#67楼 2007-11-28 16:12 | Aplia[未注册用户]
偶的问题解决了,不好意思
  回复  引用    
#68楼 2007-12-05 16:01 | 老张啊[未注册用户]
NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration().Configure();

为什么我在运行的时候老是报这句出错,信息如下
<session-factory xmlns='urn:nhibernate-configuration-2.2'> element was not found in the configuration file.

我是把配置信息单独写成了一个文件,hibernate.cfg.xml

  回复  引用    
#69楼 2008-01-20 23:00 | david_qie      
前几天我也碰到过,把hibernate.cfg.xml 设为嵌入的资源,编译后就可以了
  回复  引用  查看    
#70楼 2008-01-30 14:02 | xiebbs[未注册用户]
我的数据库是英文版的,查询带有中文的数据有问题

比如:Select * from User where userName = '张飞'
这样搜索不到结果.

我上网找了相关的解决方案是在关键字前加 N,
即 Select * from User where userName = N'张飞'
这样就可以找到结果了.

但我使用nHibernate后,语句为
Select user FROM User WHere user.userName = N'张飞'
最后被解析成
变成 N '张飞'

N后面有一个空格,造成语法错误,请问这是什么问题?如何解决?


  回复  引用    
#71楼 2008-01-30 22:26 | waitsea[未注册用户]

1,我原来的主键采用int自增长方式,中间表主键也采用自增int,运行没有问题。
2,但是因为主键为自增型,对于多数据库的同步有问题,所以改为采用36位的无重复数。
所有主键都改为36位的无重复数后, 测试报错。

大概意思是 nhibernate生成插入中间表SQL时,并没有生成ID,(从映射的意思来看,nhibernate也

的确不知道 中间表主键的生成方式,所以也不会生成中间表ID;自增类型,不需要生成中间表ID,所

以没有这个问题)

3,我把中间表的ID去掉后,数据就能保存成功了。但是又会在数据表中产生重复的记录。若把中间表

两外键组合为主键时,插入相同数据时,会报关联约束错误的。


以上情况,导致多对多映射,采用32位无重复数ID时,会遇到上述问。

请问 前辈们遇到此类情况是怎样处理的?小弟先谢过了!

  回复  引用    
#72楼 2008-03-12 09:10 | Nhibernate 学习中!![未注册用户]
我用MyGeneration 生成的实体类的属性类型是Unknown
这是为什么啊
急啊!!

  回复  引用    
#73楼 2008-03-13 20:56 | 云朵朵[未注册用户]
請問,ADO.NET和NHB數據庫操作如何保持在一個事務里?
  回复  引用    
#74楼 2008-03-25 16:46 | jazz[未注册用户]
楼主,就是我下载了你的“快速起步”里的示例,可是我不会用,我是初学者,顺便问一下,怎么用你现有的示例进行单元测试。?
  回复  引用    
#75楼 2008-03-25 17:32 | jazz[未注册用户]
呵呵,楼主,我刚才又学习了一下怎么进行单元测试,这个已经掌握了,可是对你的示例进行单元测试就是不可以,当我Open那个exe时就会出错。
  回复  引用    
#76楼 2008-03-26 14:22 | jazz[未注册用户]
[SQL: INSERT INTO my_users (Name, Password, EmailAddress, LastLogon, LogonId) VALUES (?, ?, ?, ?, ?)]
楼主,这个问题怎么解决,我在网上查的说是映射文件表名的问题,可是我查了我的映射文件“<class name="NHibernate.Demo.QuickStart.User, NHibernate.Demo.QuickStart" table="my_users">”表名是my_users
跟我数据库里的表名是一样的呀,为什么还会出这样的问题?请楼主帮忙分析一下?谢谢!

  回复  引用    
#77楼 2008-05-30 09:22 | jing99[未注册用户]
未能加载文件或程序集“NHibernateExp.App_Code.Model”或它的某一个依赖项。系统找不到指定的文件。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.IO.FileNotFoundException: 未能加载文件或程序集“NHibernateExp.App_Code.Model”或它的某一个依赖项。系统找不到指定的文件。

源错误:


行 38: cfg = new Configuration();
行 39:
行 40: cfg.AddAssembly(AssemblyName);
行 41:
行 42: sessions = cfg.BuildSessionFactory();

大家帮我看看这是什么原因呀?

  回复  引用    
#78楼 2008-06-25 11:28 | 陈建勤[未注册用户]
我用NHibernate框架开发了两个系统,这个两个系统层次架构完全一样,但现在需要他们之间互相调用业务逻辑层,请问怎么操作比较好?NHibernate配置如何配置?
(可以把解决办法发到我邮箱 chenjianqin_stone@126.com 里吗?)

  回复  引用    
#79楼 2008-07-04 14:57 | 大李      
lz,我有几个问题想咨询一下。
1.NH 能执行复杂一点的sql语句吗?不用他直接执行sql的方式。
比如,update 根据另张表结果。
2.NH 怎么执行批量操作呢,比如同时操作主从表呢。

初学NH,见谅。

  回复  引用  查看    
#80楼 2008-12-12 11:51 | kln[未注册用户]
你好,刚用nhibernate,我建立一个类库,把下载的nhibernate里的DLL全部引用,配置文件,持久化类(user.cs)等都建立好了。
然后我新建立网站,把类库引用进来
但是在page_load里实例化时不能识别user

  回复  引用    
#81楼 2008-12-19 08:24 | herohh[未注册用户]
最近要用nhibernate,所以自己也做了一下,但是在程序运行(C#,winform)的时候,
Configuration cfg = new Hibernate.Cfg.Configuration();
cfg.AddXmlFile("Customer.hbm.xml");
的时候出错了。
提示错误为:Could not find the dialect in the configuration
或者:Could not configure datastore from file Customer.hbm.xml
这是为什么。
我用的nhibernate是2.0.1版本,映射文件里面写的2.0或2.2都不行。

  回复  引用    
#82楼 2009-02-13 10:59 | 王晓成      
nhibernate2.0操作oralce提交事务时报错
代码如下:

Configuration config = new Configuration();
config.AddAssembly("TestCleanSnow");


ISessionFactory factory = config.BuildSessionFactory();
ISession session = factory.OpenSession();



TestNhibernate tn = new TestNhibernate();
tn.Id = Decimal.Parse("2");
tn.Name = "terry wang";
ITransaction trans = session.BeginTransaction();
try
{

session.Save(tn);
trans.Commit();

Console.WriteLine("Insert Success!");
}
catch (Exception ex)
{
trans.Rollback();
Console.WriteLine(ex.Message);
}



执行到trans.Commit()时出错,

出错信息如下:

NHibernate.HibernateException :"could not insert: [TestCleanSnow.TestNhibernate][SQL: INSERT INTO TEST_NHIBERNATE ([NAME], ID) VALUES (?, ?)]"}
innerText:ORA-00928: 缺少 SELECT 关键字

我在控制台调试看到输出NHibernate的语句是: INSERT INTO TEST_NHIBERNATE ([NAME], ID) VALUES (:p0, :p1); :p0 = 'terryerry wang', :p1 = '2'

请问是哪里出错?

  回复  引用  查看    
#83楼 2009-05-13 10:06 | piaowufeiyang_1[未注册用户]
楼主您好:我用的是one-to-many(双向),配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Springs.model.users,Springs" table="users" lazy="false">
<id name="Userno" column="userno" type="Int32">
<generator class="assigned" />
</id>
<property name="Usersex" column="usersex" type="int" length="10" />
<many-to-one name="Myuser" column="username" class="Springs.model.MyUser,Springs" />
</class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Springs.model.MyUser,Springs" table="myuser" lazy="false">
<id name="Userid" column="userid" type="Int32">
<generator class="assigned" />
<!--<generator class="native" />-->
</id>
<property name="Username" column="username" type="String" length="20" />
<property name="Userpassword" column="userpassword" type="String" length="20" />
<property name="Useremail" column="useremail" type="String" length="20" />
<bag name="UserTT" cascade="all" inverse="false" lazy="false">
<key>
<column name="Username"/>
</key>
<one-to-many class="Springs.model.users,Springs"/>
</bag>
</class>
</hibernate-mapping>


操作为save(myuser);
此时应该父表和子表都应该又一行新的信息被加入,但在父表一切正常,子表却没有加进去,捕获异常为Unexpected row count: 0; expected: 1的异常,希望可以帮忙解决下,谢谢!期待您的回复!!````


  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 466636 rQ3aO7rz7vs=



相关文章:

相关链接: