2014-02-13 67 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>