2014-02-13 39 views
0

如何使用Oracle序列使用NHibernate和Oracle?使用NHibernate和Oracle序列?

当我打电话到SaveOrUpdate()方法,它仅执行针对在Oracle序列的选择查询。

我用一个拦截器来查找会议进行查询,并且是指导我得到:

select INFO_ACCESS_REQS_ID_SEQ.nextval from dual; 

这是对我所说的底层Oracle数据库中执行的唯一的事情到ISession.SaveOrUpdate()

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > 
    <session-factory name="MyProject"> 
     <property name="connection.driver_class"> 
      NHibernate.Driver.OracleClientDriver 
     </property> 
     <property name="format_sql">true</property> 
     <property name="show_sql">true</property> 
     <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property> 
     <property name="query.substitutions"> 
      true 1, false 0, yes 'Y', no 'N' 
     </property> 
    </session-factory> 
</hibernate-configuration> 

InformationAccessRequest.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        namespace="MyProject.Model" 
        assembly="MyProject"> 
    <class name="InformationAccessRequest" table="INFO_ACCESS_REQS"> 
     <id name="Id" column="INFO_ACCESS_REQS_ID"> 
      <generator class="native"> 
       <param name="sequence">INFO_ACCESS_REQS_ID_SEQ</param> 
      </generator> 
     </id> 
     <property name="Assembly" column="ASSEMBLY_DT" /> 
     <property name="Requested" column="INFO_ACCESS_REQ_DT" /> 
     <property name="Expiration" column="INFO_ACCESS_REQ_EXP_DT" /> 
     <property name="RequesterIdentification" column="INFO_ACCESS_REQ_USR_ID" /> 
     <property name="Number" column="INFO_ACCESS_REQ_NUM" /> 
     <property name="Reception" column="INFO_ACCESS_REQ_RECEP_DT" /> 
     <property name="Creator" column="CREATOR_ID" /> 
     <property name="Created" column="CREATED_DT" /> 
     <property name="Updater" column="UPDATER_ID" /> 
     <property name="Updated" column="UPDATED_DT" /> 
     <property name="Deleted" column="DELETED_DT" /> 
    </class> 
</hibernate-mapping> 

ISession.SaveOrUpdate()

var newRequest = new InformationAccessRequest(); 
newRequest.Requested = DateTime.Today.AddDays(-1); 
newRequest.Expiration = DateTime.Today.AddDays(1); 
newRequest.Reception = DateTime.Today; 
newRequest.Number = Guid.NewGuid().ToString().Substring(0, 12); 
newRequest.RequesterIndentification = Guid.NewGuid()..ToString().Substring(0, 10); 
newRequest.Created = DateTime.Today; 
newRequest.Creator = User.Current.Login; 
newRequest.IsNew = true; 
newRequest.IsDirty = true; 
session.SaveOrUpdate(newRequest); 

提供所有需要的信息,并尊重所有数据库的约束。 SaveOrUpdate()只对该序列执行select操作,并且不会执行其他sql指令。

+0

是什么问题?你有没有想过为什么没有插入?你需要刷新或承诺发生 – Konstantin

回答

0

我刚刚发现了NHibernate与身份类型一起工作的新特性,尽管它实际上是一个旧功能。

基于这篇文章:NH2.1.0: New generators,我将指定generator classsequence-identity

从这个新生成的文章,这里的易懂的说明:

序列同一性

的“序列同一性”是基于“序列”,但工作作为一个“身份”。使用INSERT查询检索POID值。实体中的类型可能是System.Int32或System.Int64,具体取决于您的RDBMS序列生成器。

,在ORACLE运行查询是:

INSERT INTO my_entity (id, name) 
VALUES (hibernate_sequence.nextval, :p0) returning id into :nhIdOutParam 

的“hibernate_sequence”是用于在没有替代名称设置槽的映射的序列的默认名称。正如你所看到的,在这种情况下,“序列”的工作方式与“身份”一样,POID的值立即被检索到,并且生成者也有同样的“身份”问题。


InformationAccesRequest.hbm.xml(相应更新)

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        namespace="MyProject.Model" 
        assembly="MyProject"> 
    <class name="InformationAccessRequest" table="INFO_ACCESS_REQS"> 
     <id name="Id" column="INFO_ACCESS_REQS_ID"> 
      <generator class="sequence-identity"> 
       <param name="sequence">INFO_ACCESS_REQS_ID_SEQ</param> 
      </generator> 
     </id> 
     <property name="Assembly" column="ASSEMBLY_DT" /> 
     <property name="Requested" column="INFO_ACCESS_REQ_DT" /> 
     <property name="Expiration" column="INFO_ACCESS_REQ_EXP_DT" /> 
     <property name="RequesterIdentification" column="INFO_ACCESS_REQ_USR_ID" /> 
     <property name="Number" column="INFO_ACCESS_REQ_NUM" /> 
     <property name="Reception" column="INFO_ACCESS_REQ_RECEP_DT" /> 
     <property name="Creator" column="CREATOR_ID" /> 
     <property name="Created" column="CREATED_DT" /> 
     <property name="Updater" column="UPDATER_ID" /> 
     <property name="Updated" column="UPDATED_DT" /> 
     <property name="Deleted" column="DELETED_DT" /> 
    </class> 
</hibernate-mapping>