#topicpath
----
//ここにコンテンツを記述します。
#contents

**基本操作 [#f67e50ad]
***HQLでクエリを発行する [#r42f3f74]
 SessionFactory sessionfactory = config.buildSessionFactory();
 session = sessionfactory.openSession();
 List list = session.find("from UserId as userid where userid.userId like 'Masatomi%'");
 ↑ 結果(UserIdクラス)の格納されたListが返ってくる

HQLの文法などはいろんなサイトで説明されているので割愛。上の意味だけ。
 from UserId[1] as userid[2] where userid[2].userId[3] like 'Masatomi%'
 ↑ 意味は、[1]のクラスを検索します。条件は[3]のフィールドが'Masatomi%'であるようなレコード
 ↑ [2]はエイリアスなんでなんでもよいでしょう


***キー値指定で直接レコードを取得する [#xad1af6b]
 SessionFactory sessionfactory = config.buildSessionFactory();
 session = sessionfactory.openSession();
 UserId aUser=(UserId)session.load(UserId.class,"Masatomi"); <- 第二引数がUniqueKeyの値

***レコードのUpdate [#r79ca966]
 SessionFactory sessionfactory = config.buildSessionFactory();
 session = sessionfactory.openSession();
 UserId aUser=(UserId)session.load(UserId.class,"Masatomi");
 userid.setGroupId("GROUP01");
 session.flush();
 session.connection().commit(); //コレしないと、行ロックしちゃうっぽい

***レコードのInsert [#xb11d51c]
 SessionFactory sessionfactory = config.buildSessionFactory();
 session = sessionfactory.openSession();
 
 UserId userid = new UserId("HOGEHOGE");
 userid.setGroupId("1111");
 //その他必要なカラムをセット
 session.save(userid);
 session.flush();
 session.connection().commit();


***レコードのDelete [#r74a3a42]
 SessionFactory sessionfactory = config.buildSessionFactory();
 session = sessionfactory.openSession();
 
 UserId userid=(UserId) session.load(UserId.class,"HOGEHOGE");
 session.delete(userid);
 
 session.flush();
 session.connection().commit();


**その他 [#d3d6a0ad]
***複数の設定ファイルを使用したい [#l648af06]
hibernate.cfg.xmlはどうもひとつのデータベース設定しか書けないみたい(たぶん)。
でも場合によっては一つのデータベースだけではなく、複数のデータベースに接続することがあります。そのときに、複数の設定ファイルを切り替える方法がようやく分かりました。ちなみにTorqueで試行錯誤した経緯は[[Torque/複数のDBで同時に利用する]]をご参照。

 Configuration config = new Configuration();
 //    config = config.configure(); // <-通常の設定の読み込み
 config = config.configure(new File(
       getServlet().getServletContext().getRealPath(
         "/WEB-INF/lib/hibernate.cfg.hoge.xml")));
このようにすることで、ランタイムに設定ファイルを指定することが出来るようです。。



***結合(関連)を考える [#t380b000]
#ref(fig1.gif)
- Member -> WorkGroupを表現する

JavaBeans(ここではMember)にプロパティを追加してマッピングファイル(Member.hbm.xml)に
 <many-to-one name ="workgroup" column="GROUPNO"
  class="nu.mine.kino.binding.ait.hibernate.Workgroup" cascade="all" outer-join="auto"
  update="false" insert="false" />
を追加すればよいようだ。追加しない場合はMember#getWorkgroup()の返り値がnullになるみたい。


- WorkGroup -> Memberを表現する

JavaBeans(ここではWorkGroup)にプロパティを追加してマッピングファイル(WorkGroup.hbm.xml)に
 <set name="memberList" >
  <key ><column name="groupno" /></key>
  <one-to-many class="nu.mine.kino.binding.ait.hibernate.Member" />
 </set>
を追加すればよいようだ。追加しない場合はWorkgroup#getMemberList()の返り値がnullになるみたい。


クラス設計で考えるとWorkGroup -> Member はあってもその逆はあまりないかなぁ。ようするに
 aWorkGroup.getMembers()
はあっても
 aMember.getWorkGroup()
はないことが多いように思うけど。。。


***WEBアプリの時、設定ファイルなどはどこに置くべきか。 [#yb683b06]
:hibernate.cfg.xml|classesの直下などに置いて、各リソースの設定ファイルは
 <mapping resource="nu/mine/kino/MtAuthor.hbm.xml" />
などと指定する
:各オブジェクトの設定ファイル|Javaファイルと同じ場所に置く。

***middlegenで作ったhbmファイルについて [#d5bf7378]
たとえば
 <id name="id" type="java.lang.Integer" column="id" >
   <meta attribute="field-description">
      @hibernate.id
      generator-class="Increment"
      type="java.lang.Integer"
      column="id"
   </meta>
   <generator class="Increment" />
 </id>

   <meta attribute="field-description">
      @hibernate.id
      generator-class="Increment"
      type="java.lang.Integer"
      column="id"
   </meta>
の部分は、コメントに使われるだけ、だと思う。


----
この記事は
#vote(おもしろかった,そうでもない)

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS