[Seasar-user:15712] Re: [S2JDBC]複数テーブルの結合

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 9月 9日 (火) 18:00:05 JST


小林 (koichik) です.

Date:    Tue, 9 Sep 2008 17:15:15 +0900
From:    [E-MAIL ADDRESS DELETED]
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:15710] [S2JDBC]複数テーブルの結合

> さらにテーブルを結合して
> Two two =
> jdbcManager.from(Two.class).innerJoin("oneTwo").innerJoin("oneTwo.oneList").where("name
> = ?", "two1").getSingleResult();
> とすると以下エラーになります。
> エンティティ(One)のプロパティ(oneTwo)が不正です。JoinColumnのnameで指定されている外部キー(ONE_TWO_ID)が存在しません。

> Oneエンティティ
> @ManyToOne
> public OneTwo oneTwo;

One から OneTwo への関連が多対 1 なら,
one から one_two への外部キーが必要ですが,

> CREATE TABLE one(
>   id SERIAL PRIMARY KEY,
>   name VARCHAR(64) NOT NULL
> );

ありません.
「外部キー(ONE_TWO_ID)が存在しません」は
そういう意味です.

実際は one_two テーブルが関連テーブルでしょうから,
one テーブルに外部キーを持ちたいわけではなく,
One#oneTwho の多重度の指定が間違っているのだと
思います.

例えば,関連テーブルを外して考えた場合に
# '*' は多の側

+-----+    +-----+    +-------+
| One |*---| Two |---*| Three |
+-----+    +-----+    +-------+

としたい場合,関連テーブルを含めると

+-----+    +--------+    +-----+    +----------+    +-------+
| One |----| OneTwo |*---| Two |---*| TwoThree |----| Three |
+-----+    +--------+    +-----+    +----------+    +-------+

となります.
また,関連は外部キーを持っている側が所有側なので,
One,Two,Three の持つ関連は全て被所有側となり,
mappedBy が必要になります.

Oneエンティティ
@OneToOne(mappedBy = "one")
public OneTwo oneTwo;

Twoエンティティ
@OneToMany(mappedBy = "two")
public List<OneTwo> oneTwoList;
@OneToMany(mappedBy = "two")
public List<TwoThree> twoThreeList;

Threeエンティティ
@OneToOne(mappedBy = "three")
public TwoThree twoThree;

OneTwoエンティティ
@OneToOne
public One one;
@ManyToOne
public Two two;

TwoThreeエンティティ
@ManyToOne
public Two two;
@OneToOne
public Three three;


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-user メーリングリストの案内