// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
Hibernateのマッピング定義についていろいろ調べてみました。例を使ってまとめておきます。


#contents


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


***E-R図 [#qa83948d]
#ref(er.png)


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


*** テーブル定義 [#n3de2d09]
-describe USER;
 +-------+------------------+------+-----+---------+----------------+
 | Field | Type             | Null | Key | Default | Extra          |
 +-------+------------------+------+-----+---------+----------------+
 | ID    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
 | NAME  | varchar(45)      | YES  |     | NULL    |                |
 +-------+------------------+------+-----+---------+----------------+
 2 rows in set (0.00 sec)

-describe CUSTOMER;
 +---------+------------------+------+-----+---------+----------------+
 | Field   | Type             | Null | Key | Default | Extra          |
 +---------+------------------+------+-----+---------+----------------+
 | ID      | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
 | NAME    | varchar(45)      | YES  |     | NULL    |                |
 | USER_ID | int(10) unsigned | YES  | MUL | 0       |                |
 +---------+------------------+------+-----+---------+----------------+
 3 rows in set (0.00 sec)

-show create table USER;
 CREATE TABLE `USER` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `NAME` varchar(45) character set ujis default '',
  PRIMARY KEY  (`ID`)
 )

-show create table CUSTOMER;
 CREATE TABLE `CUSTOMER` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `NAME` varchar(45) character set ujis default '',
  `USER_ID` int(10) unsigned default '0',
  PRIMARY KEY  (`ID`),
  KEY `FK52C76FDE65079CAA` (`USER_ID`),
  CONSTRAINT `FK52C76FDE65079CAA` FOREIGN KEY (`USER_ID`) REFERENCES `USER` (`ID`)
 )



***JavaBeansとhbm.xmlファイル [#j4e88693]
-User.java
 public class User implements java.io.Serializable {
   // Fields
   private int id;
   private String name;
   private Set customers = new HashSet(0);
   public String toString() {
     return new ToStringBuilder(this).append("id", getId()).append("name",
         getName()).toString();
   }
  getter/setterは省略
 }

-User.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">
 <!-- Generated 2006/11/12 9:58:17 by Hibernate Tools 3.2.0.beta6a -->
 <hibernate-mapping>
   <class name="nu.mine.kino.entity.User" table="USER" catalog="Samples">
     <comment></comment>
     <id name="id" type="int">
       <column name="ID" />
       <generator class="increment" />
     </id>
     <property name="name" type="string">
       <column name="NAME" length="45">
         <comment></comment>
       </column>
     </property>
     <set name="customers" inverse="true">
       <key>
         <column name="USER_ID">
           <comment></comment>
         </column>
       </key>
       <one-to-many class="nu.mine.kino.entity.Customer" />
     </set>
   </class>
 </hibernate-mapping>

-Customer.java
 public class Customer implements java.io.Serializable {
   // Fields
   private int id;
   private User user;
   private String name;
   public String toString() {
     return new ToStringBuilder(this).append("id", getId()).append("name",
         getName()).append("担当者", getUser()).toString();
   }
  getter/setterは省略
 }


-Customer.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">
 <!-- Generated 2006/11/12 9:58:17 by Hibernate Tools 3.2.0.beta6a -->
 <hibernate-mapping>
   <class name="nu.mine.kino.entity.Customer" table="CUSTOMER" catalog="Samples">
     <comment></comment>
     <id name="id" type="int">
       <column name="ID" />
       <generator class="increment" />
     </id>
     <many-to-one name="user" class="nu.mine.kino.entity.User" fetch="select" >
       <column name="USER_ID">
         <comment></comment>
       </column>
     </many-to-one>
     <property name="name" type="string">
       <column name="NAME" length="45">
         <comment></comment>
       </column>
     </property>
   </class>
 </hibernate-mapping>



*** hibernate.cfg.xml [#q6603fdc]
 <?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>




**いろいろテスト [#mf512739]

#ls2





**関連リンク [#x36e27cb]
-[[第11章 HQL: Hibernateクエリ言語>http://www.hibernate.org/hib_docs/reference/ja/html/queryhql.html]]

----
この記事は
#vote(おもしろかった[5],そうでもない[3])
#vote(おもしろかった[6],そうでもない[3])

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

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