Top / Hibernate / TIPS集

基本操作

HQLでクエリを発行する

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]はエイリアスなんでなんでもよいでしょう

キー値指定で直接レコードを取得する

SessionFactory sessionfactory = config.buildSessionFactory();
session = sessionfactory.openSession();
UserId aUser=(UserId)session.load(UserId.class,"Masatomi"); <- 第二引数がUniqueKeyの値

レコードのUpdate

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

レコードのInsert

SessionFactory sessionfactory = config.buildSessionFactory();
session = sessionfactory.openSession();

UserId userid = new UserId("HOGEHOGE");
userid.setGroupId("1111");
//その他必要なカラムをセット
session.save(userid);
session.flush();
session.connection().commit();

レコードのDelete

SessionFactory sessionfactory = config.buildSessionFactory();
session = sessionfactory.openSession();

UserId userid=(UserId) session.load(UserId.class,"HOGEHOGE");
session.delete(userid);

session.flush();
session.connection().commit();

その他

複数の設定ファイルを使用したい

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")));

このようにすることで、ランタイムに設定ファイルを指定することが出来るようです。。

結合(関連)を考える

fig1.gif

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になるみたい。

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()

はないことが多いように思うけど。。。


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / Hibernate / TIPS集

現在のアクセス:1062


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