Hibernate
Hibernateとは
オープンソースのO/Rマッピング(ORM)フレームワーク。オブジェクト指向+リレーショナルデータベースで開発を行うと、相互間のロジック作成に多大な時間がかかる。Hibernateは永続化層に対する開発者の作業を軽減する目的で作成されている。
O/Rデータベースマッピングフレームワーク
オブジェクト指向とリレーショナルデータベースを用いてシステムを開発すると、インピーダンス・ミスマッチ(Impedance Mismatch)と呼ばれるギャップが発生する。これはオブジェクト指向とリレーショナルデータベースとの考え方が異なるためである。
O/Rマッピングフレームワークとは、このギャップを軽減するためのフレームワークのことで、O/RのOはオブジェクト、Rはリレーショナルを意味している。
入手〜設定
http://www.hibernate.org/からHibernateのバイナリファイルをダウンロードする。
入手したzipファイルを解凍し、hibernate(バージョン番号).jarファイルにクラスパスを通す。
注意事項
2.x→3.0への移行にあたり、パッケージ名が変更になった。
(旧)net.sf.hibernate.* → (新)org.hibernate.*
旧バージョンを利用する場合、パッケージ名を置き換えてください。
Hibernateの利用
- 簡単な問い合わせサンプルの実装(Quick Start)
- insert, update, delete
- 定義ファイルによる様々な設定
- 永続化前の正当性チェック
- 一意キーとGenerator
- 複数テーブルの参照(1対1)
- 複数テーブルの参照(1対多)
- 複数テーブルの参照(多対1)
リンク
Hibernate – データの追加、更新、削除(insert update delete)
insert, update, delete
レコードの追加・変更・削除を行う場合、処理をトランザクション管理下におく。
トランザクション管理はorg.hibernate.Transactionインタフェースを利用して行う。
insert
// 挿入するデータ情報(キー)の設定 EmpDto empDto = new EmpDto(); empDto.setName("new commer"); empDto.setSalary(200000); // 挿入 Transaction trans = session.beginTransaction(); session.save(empDto); trans.commit();
update
// 更新するデータ情報(キー)の設定 EmpDto empDto = (EmpDto)session.load(EmpDto.class, "100"); empDto.setName("change"); // 更新 Transaction trans = session.beginTransaction(); session.update(empDto); trans.commit();
delete
// 削除するデータ情報(キー)の設定 EmpDto empDto = new EmpDto(); empDto.setId(new Integer("100")); // 削除 Transaction trans = session.beginTransaction(); session.delete(empDto); trans.commit();
リンク
Hibernate – 複数テーブルのマッピング(多対1)
meny-to-one
多対1のマッピングを行うときは、多の永続化クラスに1の永続化クラスを保持させる。
サンプル
テーブル
以下の2つのテーブルを利用する。
SKILL表(1)
| ID | NAME |
|---|---|
| 00 | Java |
| 01 | .NET |
| 02 | PHP |
MEMBER表(多)
| ID | NAME | SKILLID |
|---|---|---|
| 00 | 鬼太郎 | 00 |
| 01 | 親父 | 00 |
| 02 | ねずみ男 | 02 |
DTO(永続化クラス)
SkillDto.java
package dto;
public class SkillDto {
private Integer id;
private String text;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
MemberDto.java
package dto;
public class MemberDto{
private Integer id;
private String name;
private Integer skillId;
private SkillDto skillDto;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSkillId() {
return skillId;
}
public void setSkillId(Integer skillId) {
this.skillId = skillId;
}
public SkillDto getSkillDto() {
return skillDto;
}
public void setSkillDto(SkillDto skillDto) {
this.skillDto = skillDto;
}
}
マッピング情報
skill.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="dto.SkillDto" table="skill">
<id name="id" column="id">
<generator class="assigned" />
</id>
<property name="text" type="java.lang.String" column="text"/>
</class>
</hibernate-mapping>
member.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="dto.MemberDto" table="MEMBER">
<id name="id" column="id" type="java.lang.Integer" >
<generator class="assigned" />
</id>
<property name="name" type="string" column="NAME" />
<property name="skillId" type="java.lang.Integer" column="skillid" />
<many-to-one name ="skillDto" column="skillID"
class="dto.SkillDto" cascade="all" outer-join="auto"
update="false" insert="false" />
</class>
</hibernate-mapping>
クライアント
MenyToOne.java
package client;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import dto.MemberDto;
import dto.SkillDto;
public class MenyToOne{
public static void main(String args[]) throws Exception{
Configuration config = new Configuration().configure();
SessionFactory sessionfactory = config.buildSessionFactory();
Session session = sessionfactory.openSession();
List list = session.createCriteria(MemberDto.class).list();
for(int i = 0; i < list.size(); i++){
MemberDto member = (MemberDto)list.get(i);
System.out.print(member.getName());
SkillDto skillDto = member.getSkillDto();
System.out.println("\t" + skillDto.getName());
}
}
}
はじめにMemberDtoをHibernate経由で取得する。そのMemberオブジェクトは対応するSkillを保持している。
実行結果
鬼太郎 Java 親父 Java ねずみ男 .NET

