万年素人からHackerへの道

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

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    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