#freeze
* [[Hibernate]]
#contents

** 環境
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>http://www.amazon.co.jp/exec/obidos/ASIN/4774128457/worried-22]]に詳細があります。

また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リファレンス・ドキュメント>http://www.hibernate.org/hib_docs/reference/ja/html/]]~
[[Hibernate>http://www.techscore.com/tech/Others/Hibernate/index.html]]~
[[Hibernateで理解するO/Rマッピング(1)>http://www.atmarkit.co.jp/fjava/rensai3/ormap01/ormap01.html]]~
[[Hibernate 入門記>http://www.wikiroom.com/koichik/index.php?Hibernate%20%C6%FE%CC%E7%B5%AD]]~
サンプルで丁寧な解説があります。~
[[MiddlegenIDEプラグイン>http://www.atmarkit.co.jp/fjava/rensai3/eclipseplgn03/eclipseplgn03_3.html]]~
[[Hibernateトラブルシューティング>http://www.javaworld.jp/enterprise/-/21962-1.html]]~
[[ファイヤープロジェクト>http://www.h7.dion.ne.jp/~matsu/feature/hibernate/index.html]]~
[[hibernateを利用してはいけない5つのシチュエーション>http://www.everes.net/145]]~
このてのツールは癖がわかるまでに一苦労ありますね。楽に開発したいだけなんですが。
** 参考書籍

** コメント
-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]] &new{2007-02-11 (日) 10:16:09};

--#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS