Hibernate

環境

http://www.hibernate.org/からHibernate CoreとHibernate Toolsをダウンロードしました。

Hibernate Tools(Update site:http://download.jboss.org/jbosside/updates/development )はEclipseに組み込んでDBよりJavaBeans,マッピングファイル,設定ファイルを自動生成してくれます。 この中のHibernate ConsoleはHQLを試すには便利です。Eclipse3.2でも動きました。 Eclipse パーフェクトマニュアル Vol.6に詳細があります。

またMiddlegen(http://boss.bekk.no/boss/middlegen/ )もあり、EclipsePlugin?として、MiddlegenIDE 1.3.3(http://sourceforge.net/project/showfiles.php?group_id=36044 )があり、自動生成してくれます。 参考http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn03/eclipseplgn03_3.html

サンプル

*     Table001
*     <many-to-one
*   		name="table003"
*   		class="org.ultimania.model.Table003"
*   		update="false" insert="false">
*   			<column name="nokokyaku" />
*   			<column name="nokanri" />
*   	</many-to-one>
	public static void main(String[] args) {
		Configuration config = new Configuration();
		config = config.configure();
		SessionFactory sessionfactory = config.buildSessionFactory();
		Session session = sessionfactory.openSession();
		Transaction tx = session.beginTransaction();
		try {
			// 1テーブル全件ロード
			Criteria crit = session.createCriteria(Table003.class);
			List list = crit.list();
			for (int i = 0; i < list.size(); i++) {
				Table003 table003 = (Table003) list.get(i);
				System.out.println("A:" + table003.getComp_id().getDbhinban() + ":" + table003.getNmsyohin());
			}
			// 1テーブルプライマリーキーで検索 load使用
			Table003PK table003PK = new Table003PK();
			table003PK.setNokokyaku("A");
			table003PK.setDbhinban("BBB");
			Table003 table003 = (Table003) session.load(Table003.class, table003PK);
			System.out.println("B:" + table003.getComp_id().getDbhinban() + ":" + table003.getNmsyohin());
			//criteriaを複数
			Criteria crit2;
			crit = session.createCriteria(Table001.class);
			crit2 = crit.createCriteria("table003");
			crit.add(Expression.like("nokanri", "OHR%"));
			crit2.add(Expression.like("comp_id.dbhinban", "%BK"));
			//where this_.dbhinban like ?
			list = crit.list();
			for (int i = 0; i < list.size(); i++) {
				Table001 table001 = (Table001) list.get(i);
				System.out.println("B1:" + table001.getNmsyohin() );
			}
			// HSQLで検索 プライマリキーの場合は、middlegenで生成したプライマリキークラスを使用
			Query q = session.createQuery("from Table003 x3 where x3.comp_id.nokokyaku = :nokokyaku");
			q.setString("nokokyaku", "TOP");
			List result = q.list();
			for (int i = 0; i < result.size(); i++) {
				Table003 table0031 = (Table003) result.get(i);
				System.out.println("C:" + table0031.getComp_id().getDbhinban() + ":" + table0031.getNmsyohin());
			}
			// HSQLで検索 件数をしている 11件目(0から始まる)から20件 同等にCriteriaでも件数指定可
			q = session.createQuery("from Table003 x3 where x3.comp_id.nokokyaku = :nokokyaku");
			q.setString("nokokyaku", "TOP");
			q.setFirstResult(10);
			q.setMaxResults(20);
			result = q.list();
			for (int i = 0; i < result.size(); i++) {
				Table003 table0031 = (Table003) result.get(i);
				System.out.println("D:" + table0031.getComp_id().getDbhinban() + ":" + table0031.getNmsyohin());
			}
			// 集合関数
			q = session.createQuery("select sum(kgjyodai),avg(kgjyodai) from Table003 x3");
			Object[] data = (Object[])q.uniqueResult();
			System.out.println("E:" + ((Integer)data[0]).toString());
			/*
			 複数の場合
			result = q.list();
			for (int i = 0; i < result.size(); i++) {
				Object[] data = (Object[])result.get(i);
				Integer a = (Integer)data[0];
				System.out.println("E:" + ((Integer)((Object[])result.get(i))[0]).toString());
			}
			*/
			// HSQLで検索 1件と分かっている場合 uniqueResultをつかっている。
			q = session.createQuery("from Table003 x3 where x3.comp_id.nokokyaku = :nokokyaku and x3.comp_id.dbhinban = :dbhinban");
			q.setString("nokokyaku", "A");
			q.setString("dbhinban", "BBB");
			table003 = (Table003) q.uniqueResult();
			System.out.println("F:" + table003.getComp_id().getDbhinban() + ":" + table003.getNmsyohin());
			// 結合(シータスタイル)
			String strSQL = " select xx001.*,xx003.* from table_xx003 xx003,table_xx001 xx001 where xx003.dbhinban = xx001.nokanri";
			strSQL = strSQL + " and xx003.dbhinban like '11%'";
			strSQL = strSQL + " order by  xx003.dbhinban";
			SQLQuery sqlQuery = session.createSQLQuery(strSQL);
			sqlQuery.addEntity("xx003", Table003.class);
			sqlQuery.addEntity("xx001", Table001.class);
			list = sqlQuery.list();
			for (int i = 0; i < list.size(); i++) {
				Object[] items = (Object[]) list.get(i);
				Table003 table003a = (Table003) items[0];
				Table001 table001a;
				if (items[1] == null) {
					table001a = new Table001();
				} else {
					table001a = (Table001) items[1];
				}
				System.out.println("G:" + table003a.getComp_id().getDbhinban() + ":" + table001a.getNolot());
			}
			// 外部結合
			strSQL = " select xx003.*,xx001.* from table_003 xx003 left join table_001 xx001 on xx003.dbhinban = xx001.nokanri";
			strSQL = strSQL + " where xx003.dbhinban like '11%'";
			strSQL = strSQL + " order by  xx003.dbhinban";
			sqlQuery = session.createSQLQuery(strSQL);
			sqlQuery.addEntity("xx003", Table003.class);
			sqlQuery.addEntity("xx001", Table001.class);
			sqlQuery.setFirstResult(0);
			sqlQuery.setMaxResults(3);
			list = sqlQuery.list();
			for (int i = 0; i < list.size(); i++) {
				Object[] items = (Object[]) list.get(i);
				Table003 table003a = (Table003) items[0];
				Table001 table001a;
				if (items[1] == null) {
					table001a = new Table001();
				} else {
					table001a = (Table001) items[1];
				}
				System.out.println("H:" + table003a.getComp_id().getDbhinban() + ":" + table001a.getNolot());
			}
			// 1件更新
			table003.setCdcolor("ほほ");
			//session.save(table003);
			// clearを使った場合、分離されsave時にinsertとなってしまうので、updateにしている。
			session.clear();
			session.update(table003);
			//一括更新
			Query query = session.createQuery("update Table003 set cdcolor = '赤'");
			int intResult = query.executeUpdate();
			System.out.println("I:" + intResult);
			tx.commit();
		} catch (HibernateException ex) {
			ex.printStackTrace();
			tx.rollback();
		} finally {
			session.close();
		}
	}

ここでのTable003PKはデフォルトでMiddlegenで生成した時にプライマリキーのクラスが別に作成されますので、そのまま使用しています。

TIPS

SQL文の表示

hibernate.cfg.xmlに

<property name="show_sql">true</property>

を追加

リンク

Hibernateリファレンス・ドキュメント
Hibernate
Hibernateで理解するO/Rマッピング(1)
Hibernate 入門記
サンプルで丁寧な解説があります。
MiddlegenIDEプラグイン
Hibernateトラブルシューティング
ファイヤープロジェクト
hibernateを利用してはいけない5つのシチュエーション
このてのツールは癖がわかるまでに一苦労ありますね。楽に開発したいだけなんですが。

参考書籍

コメント

  • Hello, my name is Alex, i'm a newbie here. I really do like your resource and really interested in things you discuss here, also would like to enter your community, hope it is possible:-) Cya around, best regards, Alex! -- Alexdjgvr? 2007-02-11 (日) 10:16:09
  • #comment

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-18 (日) 07:54:00 (6297d)