2005年06月08日

NHibernateのサンプル

 NHibernateのサンプルを紹介します。

 Middlegenから作ったマッピングファイルとhbm2netで作ったクラスファイルを使いたかっのですが、使えるものが作成されなかったので、
Doblog - いつまで続く? - [NHibernate]Hibernateの.NET版「NHibernate」で紹介されているA Quick Start Guide to NHibernate(現在リンク切れ)を元にやろうと思います。
 
 なお、Doblog - いつまで続く? - [NHibernate]Hibernateの.NET版「NHibernate」で紹介されているままだと動かないし、わかりにくいので若干手を加えてあります。
 NHibernateのバージョンは0.8.4です。
 以下のようなNHibernateSampleソリューションを考えます。
 
NHibernateSample
├─lib
│      HashCodeProvider.dll
│      Iesi.Collections.dll
│      log4net.dll
│      NHibernate.dll
│     
├─sql
│      users.sql
│     
└─src
    │  NHibernateSample.sln
    │ 
    └─QuickStart
            App.config
            App.ico
            AssemblyInfo.cs
            QuickStart.csproj
            QuickStart.csproj.user
            QuickStartMain.cs
            User.cs
            User.hbm.xml
 
 
 主なファイルの内容は以下のようになっています。
 
app.config(接続設定はSQL Server用が有効になっています)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <configSections>
  <section name="log4net" 
   type="log4net.Config.Log4NetConfigurationSectionHandler, 
   log4net" />
     <section name= "nhibernate" 
          type="System.Configuration.NameValueSectionHandler, 
          System, Version=1.0.5000.0,Culture=neutral,
     PublicKeyToken=b77a5c561934e089" />
 </configSections>
 <nhibernate>
  <add 
   key="hibernate.connection.provider"  
   value="NHibernate.Connection.DriverConnectionProvider" />
  <add 
   key="hibernate.dialect" 
   value="NHibernate.Dialect.MsSql2000Dialect" />
  <add 
   key="hibernate.connection.driver_class" 
   value="NHibernate.Driver.SqlClientDriver" />
  <add 
   key="hibernate.connection.connection_string" 
   value="Database=test;Data Source=someip;User ID=someuser;Password=somepwd" />
  <!-- This is the System.Data.OracleClient.dll provider for Oracle from MS -->
  <!--  
  <add 
   key="hibernate.dialect"                      
   value="NHibernate.Dialect.OracleDialect" 
  />
  <add 
   key="hibernate.connection.driver_class"          
   value="NHibernate.Driver.OracleClientDriver" 
  />
  
  <add 
   key="hibernate.connection.connection_string" 
   value="Data Source=ora9i;User ID=scott;Password=tiger;" 
  />
  -->
  
  
  <!-- This is the ByteFX.Data.dll provider for MySql -->
  <!-- 
  <add 
   key="hibernate.connection.driver_class"   
   value="NHibernate.Driver.ByteFXDataDriver" 
  />
  <add 
   key="hibernate.connection.connection_string" 
   value="Database=test;Data Source=someip;User Id=someuser;Password=somepwd" 
  />
  <add 
   key="hibernate.dialect"                      
   value="NHibernate.Dialect.MySQLDialect" 
  />
  -->
  
  <!-- This is the Firebird configuration --> 
  <!--
  <add 
   key="hibernate.dialect"                            
   value="NHibernate.Dialect.FirebirdDialect" 
  /> 
  <add 
   key="hibernate.connection.driver_class"                
   value="NHibernate.Driver.FirebirdDriver" 
  /> 
  <add 
   key="hibernate.connection.connection_string" 
   value="Data Source=localhost;Database=nhibernate;User=SYSDBA;
 password=masterkey;Charset=ISO8859_1;ServerType=0" /> 
  -->
  
 </nhibernate>
 <log4net>
  <appender 
  name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
   <layout type="log4net.Layout.PatternLayout">
    <param value="%d [%t] %-5p %c [%x] - %m%n" name="ConversionPattern" />
   </layout>
  </appender>
  <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
   <param value="Sample.log" name="File" />
   <param value="true" name="AppendToFile" />
   <layout type="log4net.Layout.PatternLayout">
    <param value="[Header]\r\n" name="Header" />
    <param value="[Footer]\r\n" name="Footer" />
    <param value="%d [%t] %-5p %c [%x] - %m%n" name="ConversionPattern" />
   </layout>
  </appender>
  <appender 
  name="RollingLogFileAppender" 
  type="log4net.Appender.RollingFileAppender">
   <param value="SampleRolling.log" name="File" />
   <param value="true" name="AppendToFile" />
   <param value="10" name="MaxSizeRollBackups" />
   <param value="100KB" name="MaximumFileSize" />
   <param value="Size" name="RollingStyle" />
   <param value="true" name="StaticLogFileName" />
   <layout type="log4net.Layout.PatternLayout">
    <param value="[Header]\r\n" name="Header" />
    <param value="[Footer]\r\n" name="Footer" />
    <param value="%d [%t] %-5p %c [%x] - %m%n" name="ConversionPattern" />
   </layout>
  </appender>
  <root>
   <level value="WARN" />
   <appender-ref ref="LogFileAppender"/>
   <appender-ref ref="ConsoleAppender" />
  </root>
  <logger name="Sample.LoggingExample">
   <level value="ALL" />
   <appender-ref ref="RollingLogFileAppender" />
  </logger>
 </log4net>
</configuration>


user.hbm.xml
<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
 <class table="users" name="NHibernate.Sample.QuickStart.User, QuickStart">
  <id column="LogonId" length="20" name="Id" type="String"> 
   <generator class="assigned" /> 
  </id> 
  <property column="Name" length="40" name="UserName" type="String" /> 
  <property length="20" name="Password" type="String"/> 
  <property length="40" name="EmailAddress" type="String" />
  <property name="LastLogon" type="DateTime" />
 </class>
</hibernate-mapping>
 
user.cs
using System;
namespace NHibernate.Sample.QuickStart
{
 public class User
 {
  private string id;
  private string userName;
  private string password;
  private string emailAddress;
  private DateTime lastLogon;

  public User()
  {
  }
  public string Id 
  {
   get { return id; }
   set { id = value; }
  }
  public string UserName 
  {
   get { return userName; }
   set { userName = value; }
  }
  public string Password 
  {
   get { return password; }
   set { password = value; }
  }
  public string EmailAddress 
  {
   get { return emailAddress; }
   set { emailAddress = value; }
  }
  public DateTime LastLogon 
  {
   get { return lastLogon; }
   set { lastLogon = value; }
  }
 }
}
 
QuickStartMain.cs
using System;
using NHibernate.Cfg;
namespace NHibernate.Sample.QuickStart
{
 class QuickStartMain
 {
  [STAThread]
  public static void Main(string[] args)
  {
   try
   {
    Configuration cfg = new Configuration();
    cfg.AddAssembly("QuickStart");
    ISessionFactory factory = cfg.BuildSessionFactory();
    ISession session = factory.OpenSession();
    ITransaction transaction = session.BeginTransaction();
    User newUser = new User();
    newUser.Id = "user1";
    newUser.UserName = "user1_name";
    newUser.Password = "user1_pass";
    newUser.EmailAddress = "user1@nhibernate.sample.com";
    newUser.LastLogon = DateTime.Now;
    session.Save(newUser);
    transaction.Commit();
    session.Close();
    Console.WriteLine("追加完了");
   }
   catch (Exception e)
   {
    Console.WriteLine(e.ToString());
   }
   finally
   {
    Console.ReadLine();
   }
  }
 }
}
 
【手順】
1、users.sqlを実行しUsesテーブルを作成します。
 (ホスト、データベースは任意で構いません。)
2、NHIbernateSample.zipをダウンロードし、適当な場所に解凍します。
3、NHIbernateSampleをVisual Studio 2003で開きホスト名、データベース名、ユーザー名、パスワードをapp.configに記入します。
4、実行します。
 
 「追加完了」と表示されれば成功です。データベースのテーブルUsersにデータが1件登録されているはずです。
簡単なサンプルなのでこれだけです。

 このサンプルの肝は、マッピングファイル(user.hbm.xml)のプロパティを「埋め込まれたりソース」としていることとConfigurationのAddAssemblyで自分自身(QuickSample)を指定しているところでしょうか。
 
 興味を持ったら、色んな操作を試してみて下さい。

人気blogランキング


posted by よっしぃ at 21:07 | Comment(0) | TrackBack(0) | .NET
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。