Top / Hibernate / マッピング定義について

Hibernateのマッピング定義についていろいろ調べてみました。例を使ってまとめておきます。

例となるモデル

あるサービスの顧客(Customer)とその担当者(User)というモデルを例にして考えてみます。担当者は複数の顧客を担当しています。逆に顧客にはひとり、担当者がついています。ついていない場合もあるとしましょう。

E-R図

er.png

CustomerはUserへの外部キーをもつことで担当者を表現しています。また担当がまだ着いていない場合もあるということでこの外部キーカラムはnullをOKとしています。

テーブル定義

JavaBeans?とhbm.xmlファイル

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
    <property name="hibernate.connection.username">xxxx</property>
    <property name="hibernate.connection.password">xxxx</property>
    <property name="hibernate.connection.url">jdbc:mysql://xxxx/Samples?useUnicode=true
                                  &amp;characterEncoding=ujis</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    <mapping resource="nu/mine/kino/entity/User.hbm.xml" />
    <mapping resource="nu/mine/kino/entity/Customer.hbm.xml" />
  </session-factory>
</hibernate-configuration>

いろいろテスト

推移的に永続化するかどうか

以下のようにまだテーブルに登録されていない担当者をつかって顧客に関連づけてみます。

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

User user = new User();
user.setName("担当者1");

Customer customer = new Customer();
customer.setName("顧客1");
customer.setUser(user);
session.save(customer);

tx.commit();
session.close();

Customer.hbm.xmlのmany-to-oneの設定が

<many-to-one name="user" class="nu.mine.kino.entity.User" fetch="select">

というようにカスケード指定がない場合、

org.hibernate.TransientObjectException: nu.mine.kino.entity.User

という例外が発生します。

<many-to-one name="user" class="nu.mine.kino.entity.User" fetch="select" cascade="save-update">

とカスケード指定すると、まずは「担当者1」を登録後、「顧客1」を登録しにいきます。「担当者1」を明示的にsaveする必要はないって事ですね。


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / Hibernate / マッピング定義について

現在のアクセス:22898


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS