- PR -

HibernateのSetコレクションの中身が1つしか返ってこない。

1
投稿者投稿内容
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-04-11 11:22
使用環境:
Hibernate-2.1
PostgreSQL8.1.8
WindowsXP

empテーブル
id:1
name:倉田 あさみ
furigana:くらた あさみ
sex:女
...
などのデータが入っています。

また、itemテーブルには
item_id | user_id | item_name
---------+---------+----------------------
1 | 1 | Hibernate in Action
2 | 2 | SQL Reference
3 | 1 | Ajax in Action
4 | 1 | Design Pattern
5 | 3 | Linux コマンドブック
6 | 1 | 天然水 南アルプス
7 | 1 | santeFX NEO
などのアイテムが入っています。

次に、EmpEntity.hbm.xmlファイルの構成です。
<?xml version="1.0" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="entity">
<class name="EmpEntity" table="EMP">
<id name="id" column="id" type="int" >
<generator class="assigned" />
</id>
<property name="name" type="string" column="name" />
<property name="furigana" type="string" column="furigana" />
<property name="sex" type="string" column="sex" />
<property name="age" type="int" column="age" />
<property name="blood" type="string" column="blood" />
<property name="ken" type="string" column="ken" />
<property name="phone" type="string" column="phone" />
<property name="mobile" type="string" column="mobile" />

<set name="items"
table="ITEM"
inverse="true"
cascade="all-delete-orphan">
<key column="ITEM_ID"></key>
<one-to-many class="ItemEntity"/>
</set>
</class>
<query name="findEmpById"><![CDATA[
from EmpEntity e where e.id = :id
]]></query>
</hibernate-mapping>

ItemEntity.hbm.xmlの構成です。
<?xml version="1.0" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="entity">
<class name="ItemEntity" table="ITEM">
<id name="id" column="item_id" type="int" >
<generator class="increment" />
</id>
<many-to-one name="user"
column="user_id"
class="EmpEntity"
cascade="save-update">
</many-to-one>
<property name="name" type="string" column="item_name" />

</class>
</hibernate-mapping>

以上の構成の時、
EmpEntity eを1つ取得し、eが持っているitemsを表示させたいのですが、なぜかitemsの中身が1つになってしまいます。

コードは以下です。
EmpEntity e = (EmpEntity) session.getNamedQuery("findEmpById")
.setParameter("id", 1)
.uniqueResult();

System.out.println(e.getItems().size());
for (Iterator<ItemEntity> it = e.getItems().iterator(); it.hasNext();) {
ItemEntity item = it.next();
System.out.println("アイテム名:" + item.getName() + "(所有者:" + item.getUser().getName() + ")");
}
_________________
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-04-11 11:30
すみません。自己解決しました。

EntityEmp.hbm.xmlの
<set name="items"
table="ITEM"
inverse="true"
cascade="all-delete-orphan">
<key column="ITEM_ID"></key>
<one-to-many class="ItemEntity"/>
</set>
</class>
<query name="findEmpById"><![CDATA[
from EmpEntity e where e.id = :id
]]></query>
</hibernate-mapping>

の<key>のcolumnをUSER_IDにしないといけませんでした。
意味の無い質問で申し訳ありません。
_________________
1

スキルアップ/キャリアアップ(JOB@IT)