- PR -

Hibernateの外部結合でObjectNotFoundException

1
投稿者投稿内容
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-06-13 19:43
掲題の通りなんですが、外部結合を行ったデータの読み取りで例外が発生して困っております。
思いつきでも構いませんので何かヒントを頂ければ大変助かります。

以下、主な設定ですが主要部分を抜き出しています。個人的ににはSQLのトレースで、2つ目
のSQLが手がかりになると考えています(出ないのが正しい?)

■主となるテーブル
<hibernate-mapping package="pojo">
<class
name="Project"
table="project"
lazy="false">
<meta attribute="sync-DAO">false</meta>
<id
name="Id"
type="string"
column="project_id">
<generator class="sequence"/>
</id>
<many-to-one
name ="Customer"
column="customer_code"
class="Customer"
insert="false"
update="false"/>
</class>
</hibernate-mapping>

■従となるテーブル
<hibernate-mapping package="pojo">
<class
name="Customer"
table="customer"
lazy="false">
<meta attribute="sync-DAO">false</meta>
<id
name="Id"
type="string"
column="customer_code">
<generator class="assigned"/>
</id>
<property
name="CustomerName"
column="customer_name"
type="string"
not-null="false"/>
</class>
</hibernate-mapping>

■実行したHQL文
from Project project
left outer join fetch project.Customer customer
order by
project.Id

■hibernate経由で発行されたSQL文
SELECT
project0_.project_id as project1_6_0_,
customer1_.customer_code as customer1_0_1_,
customer1_.customer_name as customer2_0_1_,
FROM
project project0_ left outer join customer customer1_ on project0_.customer_code=customer1_.customer_code
ORDER BY
project0_.project_id

SELECT
customer0_.customer_code as customer1_0_0_,
customer0_.customer_name as customer2_0_0_
FROM
customer customer0_
WHERE
customer0_.customer_code=?

■主な環境
JDK :1.5.0_06
Hibernate :3.1.3
DB :PostgreSQL7.4
TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-06-15 16:22
自己レスです。どうやら主テーブルと従テーブル側でキーが不整合なデータをフェッチした際に
例外が発生していた模様です。データの整合性を整備したところ例外は出なくなりましたが、
コレって、外部結合になっていない気がするんですがこんなもんなんでしょうか。。。

[ メッセージ編集済み 編集者: TAKEZO 編集日時 2006-06-16 10:41 ]
はちぃ
常連さん
会議室デビュー日: 2004/12/20
投稿数: 29
投稿日時: 2006-06-15 18:04
あたってるかわかりませんが、、

「hibernate.max_fetch_depth」をHibernate.cfg.xmlで
指定されていますか?
デフォルトが何になるかわからないのですが、
「hibernate.max_fetch_depth」の値が0だと、
外部結合にならないと思います。

TAKEZO
ベテラン
会議室デビュー日: 2003/12/25
投稿数: 59
投稿日時: 2006-06-16 11:03
はちぃさん、助言頂きありがとうございます。早速、試してみましたがうまく動作しませんでした。
2つのテーブルから外部結合でデータをフェッチして、オブジェクトにマッピングする際に
主オブジェクトに含まれる従オブジェクトがnullで初期化できればいいだけなんですが、
発想が根本的に間違っているんですかね。。。。Lazy辺りも怪しいかなと疑ったりしています。
はちぃ
常連さん
会議室デビュー日: 2004/12/20
投稿数: 29
投稿日時: 2006-06-19 11:34
引用:

TAKEZOさんの書き込み (2006-06-16 11:03) より:
はちぃさん、助言頂きありがとうございます。早速、試してみましたがうまく動作しませんでした。
2つのテーブルから外部結合でデータをフェッチして、オブジェクトにマッピングする際に
主オブジェクトに含まれる従オブジェクトがnullで初期化できればいいだけなんですが、
発想が根本的に間違っているんですかね。。。。Lazy辺りも怪しいかなと疑ったりしています。



たしかに、Lazy当たりが怪しそうですねぇ。
↓こちらが参考になるかもしれません。
http://d.hatena.ne.jp/da-yoshi/20060201
1

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