JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » .Net Framework » .NET Open Source: Nhibernate, Castle  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 NHibernate在ORM的簡單應用
hugo_Ephebe





發文: 6
積分: 0
於 2008-06-03 11:56 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
系統環境:
1. 請去http://www.hibernate.org/343.html下載最新版,我下載的是NHibernate-1.2.1.GA.msi。
2. 資料庫是用SQLLite,請去http://sqlite.phxsoftware.com/,下載最新版。

系統架構:
1. Dao就是撈取物件的介面,參考加入NHibernate.dll。
2. Domain是Business Entity的擺放位置。
3. MainConsole代表這是一個Console程式,參考加入Dao、Domain。這邊要注意的是雖然System.Data.SQLite.DLL註冊到GAC去了,但nH還是找不到的,需要複製一份在執行目錄下。

Domain
有三個類別,Customer繼承Party,Customer有很多Account。

設定檔
設定檔要注意的細節很多。 App.Config要注意,我是用System.Data.SQLLite.dll跟官方的不同,所以要在DbProviderFactories?註明。hibernate.connection.driver_class也要注意是NHibernate.Driver.SQLite20Driver
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<configSections>
    <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite"/>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite"
      description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
 
  <nhibernate>
    <add key="hibernate.show_sql" value="false"/>
    <add key="hibernate.dialect" value="NHibernate.Dialect.SQLiteDialect"/>
    <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
    <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SQLite20Driver"/>
    <add key="hibernate.connection.connection_string" value="Data Source=Test.s3db;Version=3"/>
    <add key="hibernate.query.substitutions" value="true=1;false=0"/>
  </nhibernate>

Customer.hbm.xml
我的繼承策略,hibernate叫table per subclass。子類別還有一個集合,所以寫來像這樣。它是一個內嵌資源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain" assembly="Domain">
  <class name="Party" table="Party">
    <id name="PartyNo" column="PartyNo" type="int">
      <generator class="assigned" />
    </id>
    <property name="Name" type="String" />
    <property name="Tel" type="String" />
    <property name="Address" type="String" />
    <property name="BirthDay" type="Date" />
    <joined-subclass name="Customer" table="Customer">
      <key column="PartyNo"/>
      <property name="CustomerID" type="String" />
      <property name="AttendDate" type="Date" />
      <list name="CustAccount">
        <key column="customerID"/>
        <index column="SortNo"></index>
        <one-to-many class="Account"/>
      </list>
    </joined-subclass>
  </class>
 
  <class name="Account" table="Account">
    <id type="String" column="AccountID" name="AccountID">
      <generator class="assigned" />
    </id>
    <property type="int" column="Level" name="Level"/>
  </class>
</hibernate-mapping>

程式
第一個要注意的,要匯入設定檔,需要一個Singleton的ISessionFactory物件,寫在Sessions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class Sessions
{
    private static readonly object lockObj = new object();
    private static ISessionFactory _factory;
 
    public Sessions(){}
 
    public static ISessionFactory Factory
    {
        get
        {
            if (_factory == null)
            {
                lock (lockObj)
                {
                    if (_factory == null)
                    {
                        NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration()
                        .AddAssembly("MainConsole");
                        _factory = cfg.BuildSessionFactory();
                    }
                }
            }
            return _factory;
        }
    }
    public static ISession GetSession()
    {
        return Factory.OpenSession();
    }
}
 
public class CustomerDao
{
    public Party GetCustomerByNo(int partyNo)
    {
        ISession handler = null;
 
        try
        {
            handler = Sessions.GetSession();
            return handler.Get<Party>(partyNo);
        }
        catch (Exception ex)
        {
            throw;
        }
        finally
        {
            handler.Close();
        }
    }
}


reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
3177 NHibernate在ORM的簡單應用 hugo_Ephebe 4157 2008-06-03 11:56
» JWorld@TW »  .Net Framework » .NET Open Source: Nhibernate, Castle

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8