JAVA開発メモ
Hibernate のバックアップソース(No.14)
 

[トップ|一覧|単語検索|最終更新|バックアップ|ヘルプ]

*概要
 HibernateはGNUのLGPLで公開、配布されているオープンソースのO/Rマッピングツールです。軽快な動作と実用性の高さでJDOの有力な対抗馬とされています。検索にはHQL(Hibernate Query Language)というSQLに似た独自の問い合わせ言語を使用する方法とオブジェクト指向な設定方法があります。サブクエリや集計関数もサポートするなど、JDOの問い合わせ言語であるJDOQLと比べるとかなり実用度が高いです。

*NEWS
-2005/4/18 - Hibernate 3.0.1 リリース
--added HQL tuple constructor/comparison feature
--added HQL "fetch all properties" override if instrumentation is used for lazy loading
--added HQL projection feature, return Lists instead of arrays for projection
--added HQL projection feature, return Maps with user-defined HQL SELECT aliases as keys
--added HQL support for expressions in aggregation functions
--added new IntegrityViolationException to MySQL dialect
--added value mapping type 'big_integer'
--added not-found="ignore|exception" switch for legacy associations (i.e. broken database integrity)
--added fully automatic Session scoping in JTA environments with sf.getCurrentSession()
--fixed bug in DTD that wouldn't allow union-subclass in separate file
--fixed a MS SQL Server case sensitivity issue with native SQL queries
--fixed a minor bug in subselect fetching
--fixed case sensitivity in HQL functions
--fixed a bug with listener assignment for save() operation (Matthew Inger)
--fixed return-property in named SQL queries to work with all identifier names
--fixed TransactionManager lookup (again) for WAS 6.0
--fixed a bug with HQL batch delete and MS SQL Server
--fixed session not getting closed with auto_close when rollback occured
--improved concatentation handling in AST parser
--updated dom4j to avoid memory leak in old version
--updated C3P0
-2005/3/31 - Hibernate 3.0 リリース
--added support for autoflush/autoclose to HibernateServiceMBean
--fixed initialization/session association detection problem of collections
--fixed creation of FK constraints to union superclass table
--fixed bug where union-subclass table did not get a PK constraint
--added a separate log category for HQL parser warnings and errors
--fixed bulk delete operation on MS SQL Server
--added support for proxying protected methods (Juozas)
--added support for unicode quoted strings in new HQL parser
--fixed implied joins in subselect WHERE clause in new HQL parser
--added SQLServer7Dialect to handle differences in functions
--added support for JNDI-bound cache instances, future use for JBoss Cache
--added scale attribute to column mappings for numeric precision control
--added fetch=subselect for collections
--added support for bulk update/delete against discriminator-based inheritence hierarchies
--added the ability to use naked property refs in HQL (required in update/delete statements)
--updated CGLIB 2.1.0
--fixed NPE at BasicEntityPersister.getPropertyIndex (Todd Nine)
--fixed issue with entity-name and subclasses (Sverker Abrahamsson)
--fixed issue with correlated subqueries in new HQL parser
--fixed a problem with native SQL query mapping and embedded composite identifiers
--improved mapping binding, allowing unordered extends for pure entity-name hiearchies
--fixed NPE for delete() with deprecated Lifecycle interface
--fixed a problem with serial joins ending in component value in new HQL parser
--fixed inner join/subselect precedence problem in new HQL parser
--fixed indices() function in new HQL parser
--fixed a bug in InformixDialect, now correct LIMIT clause
--fixed a bug in idbag.remove() (Sebastien Cesbron)
--fixed a conflict on OracleDialect between setMaxResult and LockMode.UPGRADE
--fixed XML configuration file issue with SchemaExport
--fixed an ArrayIndexOutOfBounds problem
--renamed executeUpate() to executeUpdate()
--fixed batch loading for property-ref entities
--fixed loading from cache of <key property-ref> collection owner
--fixed minor bug in SQL exception reporting
--fixed dynamic-component cannot be bound to XML
--fixed querying component with formula property
--fixed incorrect table alias for order-by on many-to-many
--fixed a bug for unidirectional one-to-many with moving child objects
--fixed a bug with union-subclasses and persister creation
--fixed a HQL concatenation problem on MySQL
--fixed a bug where an unnecessary exception was thrown for a property-ref to a superclass property
--fixed minor dtd bug
--fixed new bug in Clob/Blob support
--fixed issue with INDEX_OP and subclass joins on theta-join dialects
--fixed some minor issues in query cache regions, including HB-1449
--fixed superflous import and regression bug in verifyparameters
--fixed two bugs in select id generator (Malcolm Green)
--fixed increment generator for union-subclass mappings
--updated JBoss Cache to 1.2.1alpha, fixing locking issues
--made stat classes serializable
--fixed merge(), now ignores blob and clob fields
--added support/dialect for TimesTen
--improved algorithm for batch fetching, more aggressive
--improved toStrings()s for Statistics objects (Ryan Lynch)
--renamed <result-*> to <return-*> for externalized SQL query mapping
--renamed Session.openSession() for EntityMode to Session.getSession()
--added support for CASE in HQL
--fixed bug with filters and polymorphic queries
--fixed import ordering problem of super/subclass mappings
--switched to patched ANTLR 2.7.5, now using context classloader before doing class.forname
--TableHiloGenerator now falls back to TableGenerator properly with max_lo < 2 (Emmanuel Bernard)
--better transaction handling of TableGenerator in a JTA environment  (Emmanuel Bernard)
--removed hard coded log4j dependency (Emmanuel Bernard)
--added support for stored procedure in named queries (Max Andersen)
--added <property-result> to named SQL queries to allow users to use sql without {}-markup
--added multi-column property support to native SQL mapping
-2005/1/30 - Hibernate 2.1.8リリース
--fixed a bad bug in saveOrUpdateCopy() that caused NonUniqueObjectExceptions
--fixed problems with long types in Oracle DDL generation
--fixed a memory management problem when deleting collections
--schema export now uses hibernate.default_schema (Michael Gloegl)
--fixed broken query cache invalidation from 2.1.7
--fixed a problem with schema update on some databases
--support MySQL rlike operator in HQL
--fixed a minor problem with Hibernate Clobs and Blobs
--added support for WebSphere's weird TxManagerLookup
--Add LockAcquisitionErrorCodes to MySQL dialect (Jesse Barnum, Emmanuel Bernard)

*特徴
-1対1、n対1、1対n、n対nの関係に対応可能
-XDocletに対応されている
-Hibernateのみでコネクションプーリングが可能
-アプリケーションサーバよりデータソースを取得する設定が可能
-遅延読み込みが可能
-SQLのサブクエリ、集計関数に対応

*対応RDB
DB2,FrontBase,HSQLDB,informix,interbase,MS SQL server,MySQL, Oracle,Pointbase,PostgreSQL,Sybase etc.

*準備するファイル
-接続するDB毎のHibernate設定ファイル(プロパティファイル or XMLファイル)
-テーブル毎のマッピングファイル(XMLファイル)
-テーブル毎のJAVAクラスファイル

*情報源
-[[公式サイト:http://www.hibernate.org/]]
-[[リファレンスドキュメント:http://www.geocities.jp/ogaponman/TechnoInf/Hibernate/html_single/]]
-[[リファレンスマニュアルの日本語訳:http://www.hibernate.org/hib_docs/reference/ja/html/]]
-[[Working with Hibernate in Eclipse:http://www.onjava.com/pub/a/onjava/2004/06/23/hibernate.html]]

*Eclipseプラグイン
Eclipse用にHibernate用のプラグインがいくつか存在します。
-[[JFaceDbc:http://jfacedbc.sourceforge.net/]] - RDBのフロントエンドですが、Hibernate用ソースコード(JAVA,XML)の出力機能があります。
-[[Hibernator:http://hibernator.sourceforge.net/]] - メタデータからテーブルを作成したり、HQLを発行して結果を確認したりできます。
-[[Hibernate Synchronizer:http://hibernatesynch.sourceforge.net/]] - 定義ファイルウィザード、ファイルの同期など。
-[[HiberClipse Plugin:http://hiberclipse.sourceforge.net/]] - 定義ファイルの生成。

*サンプル
 package test;
 import java.util.List;
 import java.util.Properties;
 import net.sf.hibernate.Hibernate;
 import net.sf.hibernate.HibernateException;
 import net.sf.hibernate.Session;
 import net.sf.hibernate.Transaction;
 import net.sf.hibernate.cfg.Configuration;
 import net.sf.hibernate.expression.Expression;

 public class SampleMain {

     public static void main(String[] args) {
         Configuration cfg = null;
         Session session = null;
         Transaction transaction = null;
         Properties props = new Properties();

         try {
             cfg = new Configuration().addClass(Person.class).addProperties(props);
             session = cfg.buildSessionFactory().openSession();
             //session.setFlushMode(FlushMode.COMMIT);
             transaction = session.beginTransaction();

             Person person = new Person();
             person.setName("テスト1");

             // 追加の実行と生成されたIDの取得
             Long id = (Long) session.save(person);

             // 追加の確認(loadメソッド検索)
             Person load = (Person) session.load(Person.class, id);
             System.out.println(load);

             // 修正の実行
             person.setName("テスト2");
             session.update(person);


             // 修正の確認(HQLによるfindメソッド検索)
             List list = session.find("from Person where id=?", id, Hibernate.LONG);
             System.out.println(list);
             // 修正の確認(Expressionによるfindメソッド検索)
             List list2 =
                 session.createCriteria(Person.class).add(Expression.eq("id", id)).list();
             System.out.println(list2);

             // 削除の実行
             session.delete(person);

             // 削除の確認
             list = session.find("from Person");
             System.out.println(list);

             // SQLのコミット
             transaction.commit();

         } catch (Exception e) {
             try {
                 if (transaction != null)
                     transaction.rollback();
             } catch (Exception e1) {
                 e1.printStackTrace();
             }
             e.printStackTrace();
         } finally {
             try {
                 if (session != null && session.isOpen())
                     session.close();
             } catch (HibernateException e1) {
                 e1.printStackTrace();
             }
         }

     }
 }
Personのマッピングファイル
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
 <hibernate-mapping>
   <class name="test.Person" table="PERSON">
     <id name="id" column="ID" type="long">
       <generator class="native"/>
     </id>
     <property name="name" column="NAME" type="string" length="20" not-null="true"/>
   </class>
 </hibernate-mapping>

*悲観的ロック
for update指定でselectした行をトランザクションの終了までロックする。~
(for update nowaitを指定する場合は、LockMode.UPGRADEをLockMode.UPGRADE_NOWAITに変える)
 Person load = (Person) session.load(Person.class, id, LockMode.UPGRADE);

 List list2 = session.createCriteria(Person.class)
                     .add(Expression.eq("id", id))
                     .setLockMode(LockMode.UPGRADE)
                     .list();

~
#amazonkey2(JAVA DB)

トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Modified by MT22(Moriwaki Takashi)

"PukiWiki" 1.3.7 Copyright © 2001,2002,2003 PukiWiki Developers Team. License is GNU/GPL.
Based on "PukiWiki" 1.3 by sng
Powered by PHP 5.3.29

HTML convert time to 0.022 sec.