Hibernate データロード - プライマリキーでデータ検索

2008/09/01 22:13Update
TAGS: hibernate | データロード

サンプルからHibernateのデータロード(プライマリキーでデータ検索)の方法について 解説します。

主キーは 一つのフィールド の場合



UserMstDao.java
/*
 * AppSuperDao: 親DAOクラス(定義の解説略)
 * UserMstDao:テーブル USER_MSTを操作するクラス
 */
public class UserMstDao extends AppSuperDao {
    /**
     * セッションを取得する(共通化すべきであるメソッド)
     * @return Session
     */
    private Session getSession() {
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session s = sessionFactory.openSession();
    
        return s;
    }
    
    
    /**
     * UserMstデータロード(プライマリキーで検索)
     * @param id 主キー。Serializable の型(String、Integer、Double、...)
     * @return 合致するUserMstデータ。
     */
    public UserMst get(String id) {
        return (UserMst)getSession().get(UserMst.class, id);
    }
}


UserMstDaoTest.java
//テスト用クラス
public class UserMstDaoTest {
    public static void main(String []args) {
        UserMstDao userMstDao = new UserMstDao();
        //ID = 001のUserMstを取得する(データロード)
        UserMst userMst = userMstDao.get("001");
        
        System.out.println(userMst.getName());
    }
}


主キーは 複数のフィールド の場合



UserMstDao.java
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/*
 * AppSuperDao: 親DAOクラス(定義の解説略)
 * UserMstDao:テーブル USER_MSTを操作するクラス
 */
public class UserMstDao extends AppSuperDao {
    /**
     * セッションを取得する(共通化すべきであるメソッド)
     * @return Session
     */
    private Session getSession() {
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session s = sessionFactory.openSession();
    
        return s;
    }
    
    
    /**
     * UserMstデータロード(プライマリキーで検索)
     * @param id 主キー。UserMstKeyは主キーの型(Integer、Stringなど)。
     * @return 合致するUserMstデータ。
     */
    public UserMst get(UserMstKey id) {
        return (UserMst)getSession().get(UserMst.class, id);
    }
}


Session#getメソッドには次のような形があります。
    ◇ Session#get(Class entity, Serializable id)
    ◇ Session#get(String entityName, Serializable id)
    ◇ Session#get(Class entity, Serializable id, LockMode lockMode)
    ◇ Session#get(String entityName, Serializable id, LockMode lockMode)

指定主キーで永続オブジェクトを取得するには、Session#get()メソッドのほか、Session#load()というメソッドがあります。

その違いは、Session#get()メソッドは最初の呼び出しでDBに問い合わせを行うのに、Session#load()は遅延ロードとなります。即ち、Session#load()で返されたオブジェクトはただのProxyであり、そのオブジェクトに主キーの取得以外のメソッドが呼ばされない限り、DBに問い合わせを行いません。

参考資料


Hibernate究明 - サンプルから学ぶHibernate Proxy
Hibernate究明 - Hibernate のLAZYロード

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments