Nhibernate使用中可能遇到的问题:
1.使用oracle的配置:
<add key="hibernate.show_sql" value="true" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.OracleClientDriver" />
<add key="hibernate.connection.connection_string" value="Password=wcl20911;User ID=wcl20911;Data Source=test" />
<add key="hibernate.connection.isolation" value="ReadCommitted"/>
<add key="hibernate.dialect" value="NHibernate.Dialect.Oracle9Dialect" />
</nhibernate>
2.在控制台程序中如何配置:
单独创建一个配置文件(app.config),如此而已,Nhibernate会自动去找该文件.
3.在Web应用程序中如何配置:
在web.config中的<configuration>节点下添加如下配置:
<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<nhibernate>
<add key="hibernate.show_sql" value="true" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.OracleClientDriver" />
<add key="hibernate.connection.connection_string" value="Password=wcl20911;User ID=wcl20911;Data Source=test" />
<add key="hibernate.connection.isolation" value="ReadCommitted"/>
<add key="hibernate.dialect" value="NHibernate.Dialect.Oracle9Dialect" />
</nhibernate>4.映射文件需要注意的地方:
一.如果是oracle数据库就不存在自增类型的字段,需要把映射文件中的ID的generator 要由原来的native改成assigned
二.把映射文件的属性中"生成操作"的值从"内容"改成"嵌入的资源"
5.实体类需要注意的地方:
暂时还没发现什么影响运行的问题,不过如果用Nhibernate模版生成的话,类名全是大写,属性名跟我们平时的写法也有点不同(目前只知道在oracle数据库情况下是这样,其他数据库还没试过)
6.自增序列与严格类型匹配
在使用Oracle数据库的自增主键时,hbm.xml配置文件中generator class可设为"increment",也可设为"sequence",最好使用"increment",使用"sequence"有时在插入obj时会抛出“ORA-02289: 序列(号)不存在”异常!
另外,在load object时,传入的ID的类型要与数据库的严格一致。比如如下自增主键:
<column name="ID" sql-type="NUMBER" not-null="true" unique="true" index="IDPK"/>
<generator class="sequence" />
</id>
当使用下列语句时,将抛出异常--"identifier type mismatch\r\n参数名: id" :
但是如果像下面这样,就ok了:
OVERDUEMESSAGE nMsg = (OVERDUEMESSAGE)session.Load(typeof(OVERDUEMESSAGE),ID) ;
7.如果使用Oracle数据库的自增主键,则ISession.Save()方法返回主键值。
8.Oracle自增序列创建
(1)创建序列SEQ_TEST
(2)在目标字段上创建触发器
SELECT XTGL.SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
9. No size set for variable length data type: String
原因,在Oracle中,不支持插入0长度的字符串(即 ""),必须将该参数的值设置为null(如果是DataRow,则将对应的字段设为System.DBNull.Value,如 newRow[0] = System.DBNull.Value ;),问题就解决了。
10. 大小写
在Oracle中创建表时,表名和所有的列名都将被转化为大写。在访问Oracle中的表时,SQL语句中的表名一定要用全大写,而列名的大小写则可以忽略。
11. object references an unsaved transient instance - save the transient instance before flushing
原因: 跟映射文件中的unsaved-value的值有关,跟踪下对象,可能你要删除的对象的值刚好等于这个unsaved-value的值,这个值可能是你手动在数据库里增加的.
12. a different object with the same identifier value was already associated with the session
原因: 在同一个session中对同一个持久对象进行了两次操作,一般是在批处理的时候发生,在操作完后把缓存释放清空掉就行了(就是增加两句:session.Flush(); session.Clear(); 用session.Evict(object);是不起作用的),同时这种处理也是提高性能的一种方式(如果一定要用hibernate api的话),如果想了解nhibernate中关于"性能优化"方面的东西,可以看另外两篇文章,还是有一定帮助的:
在Hibernate应用中如何处理批量更新和批量删除
http://www.cnblogs.com/wangchunlan2004/articles/565853.html
Hibernate程序性能优化的考虑要点
http://www.cnblogs.com/wangchunlan2004/articles/565854.html
13. 产生自动增长类型主键的策略“increment”不能在集群下使用
此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键
解决这个问题的方法就是换种策略:“uuid.hex”由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
hibernate提供了产生自动增长类型主键的多种策略
http://www.cnblogs.com/wangchunlan2004/articles/764851.html
14.使用Session.Load()方法时应注意的地方
如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。如果在游离状态时才初始化它,就会产生延迟初始化错误。
15.Input string was not in a correct format
如果不是数据类型错误,那么就看下你的主键是不是非自动增长的,如果不是自动增长,那么再看下主键策略是不是assigned,如果不是,那么问题就是这里了。
16.deleted object would be re-saved by cascade
。。。。。。。。。。。。。。。。。。。。。。。
浙公网安备 33010602011771号