万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

Boo Language Advent Calendar 2012 12日目 Title:「BooからNHibernateを使ってみる 準備編」

URL: http://atnd.org/events/34622

自称Booistaのshinriyoです。mysqlとの連携は諦めましたよ。
sqlite-net」を使わずに、古い「Mono.Data.Sqlite」でDataTableを使わなければいいし。

・Boo公式ドキュメント
http://boo.codehaus.org/NHibernate

NHibernateの公式ドキュメント
http://docs.codehaus.org/display/BOO/NHibernate

一字一句確認してませんが、”全く同じ”サンプルですね。

そもそもNHiberNateって何か?
URL: http://codezine.jp/article/detail/156
NHibernateは、SQLを書かなくともテーブルのデータとクラスをシームレスに変換させるO/Rマッピング(Object/Relational Mapping)を実現できるため、コーディングの量を軽減することが可能」になるそうです。

DLLをダウンロードしようと思いましたが、

URL: http://sourceforge.net/projects/nhibernate/files/NHibernate/3.3.2GA/

NHibernate-3.3.2.GA-src.zip」から落としました。

NHibernate-3.3.2.GA-src→lib→net→3.5にNHibernate.dllなどがあります。

以下の物が全て必要らしいですが、「HashCodeProvider.dll」だけ足りませんね、とりあえず「3.5」以下のをすべて入れてみました。
「Castle.DynamicProxy.dll」
「HashCodeProvider.dll」
「Iesi.Collections.dll」
log4net.dll」

NHibernate.dll」は「Plugins」ディレクトリにいれます。

Person.booを別ファイルにしたりと、例題と微妙に変えました。

まずオブジェクトの基本となるPersonクラス作ります。
・BooHibTest.boo

class Person:
    # these properties map to database fields
    [property(ID)]    _id as int
    [property(Name)]  _name as string

    # "business method" that return initials in name
    Initials as string:
        get:
            matches = /(?<!\w)\w/.Matches(_name)
            return join(matches, "")

・BooHibTest

import System.Text.RegularExpressions
import NHibernate

# business object
class BooHibTest(MonoBehaviour):

    # initialise nHibernate stuff
    cfg = Cfg.Configuration()
    cfg.AddXmlFile("BooHibTest.hbm.xml")
    fact as NHibernate.ISessionFactory = cfg.BuildSessionFactory()
    sess as ISession = fact.OpenSession()
    
    # add "-san" to all names with an "x" in them
    xnames = sess.Find("from Person where Name like '%x%'")
    for p as Person in xnames:
        p.Name += "-san"
        print "$(p.Name) ($(p.Initials))"

    # update DB, close
    sess.Flush()
    sess.Close()

さらに、マッピング定義を記述します。
・BooHibTest.hbm.xml
→ .xmlだけでなく、.hbm.xml ですね

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

<class name="BooHibTest.Person, BooHibTest" table="person">
    <id name="ID" column="id" type="Int32">
        <generator class="assigned" />
    </id>
    <property name="Name" column= "name" type="String" length="100"/>
</class>

</hibernate-mapping>

現状こんなエラーのままですね。
「HashCodeProvider.dll」だけ足りなかったせいなのかもしれないので次回!
「HashCodeProvider.dll」どこかな?

Internal compiler error. See the console log for more information. output was:
Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.
  at (wrapper managed-to-native) System.Reflection.Assembly:GetTypes (bool)
  at System.Reflection.Assembly.GetTypes () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.RootNamespace.ComputeNamespaces (System.Reflection.Assembly assembly, System.Type extensionType) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.RootNamespace.ComputeNamespace (Mono.CSharp.CompilerContext ctx, System.Type extensionType) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.GlobalRootNamespace.ComputeNamespaces (Mono.CSharp.CompilerContext ctx) [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.LoadReferences () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.Compile () [0x00000] in <filename unknown>:0 
  at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in <filename unknown>:0