[Seasar-user:17203] Re: 2 多対一関連と dto への詰め込みについての質問

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2009年 4月 7日 (火) 17:00:41 JST


小林 (koichik) です.

Date:    7 Apr 2009 10:39:19 +0900
From:    oriwa <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:17195] 2 多対一関連と dto への詰め込みについての質問

> 例えば、下記の二つの表があったとき、
> create table users (
> user_id varchar(15) primary key,
> user_pass varchar(15) not null,
> user_name varchar(63)
> );
> create table role (
> user_id varchar(15) not null,
> user_role varchar(15) not null,
> PRIMARY KEY(user_id, user_role),
> FOREIGN KEY(user_id) REFERENCES users(user_id)
> );
> ---
> (1) ひとつのRoleに複数のuserが属するので、

そうなってはいませんね.
Role の主キーには user_id が含まれているので,
一つの Role は必ず一つの Users と関連します.

同じ user_role を持ち user_id が異なる複数の
Role が存在することは可能ですが,それらは別の
Role です (それを一つの Role としたいなら
中村さんが書いているように関連テーブルを
使うべきです).

逆に,同じ user_id を持ち,異なる user_role を
持つ Role が存在可能なので,一つの Users に
複数の Role が関連します.

よって,

> s2-jdbc-genでは、users<-OneToMany->roleとして生成されます。
> #Usersエンティティの方にroleListが作成される

となります.

> 外部キーが設定されている方がManyになるとの規則があるとのことですが、今回の場合は存在しないuser_idが登録されることを防ぐためにroleの方に外部キーを設定しました。
> このような場合、正しくrole<-OneToMany->usersとするためにはどのようにすればいいでしょうか?

ちょっと制約がよく分からないのですが,素直に
Users の方に外部キーを持たせるとこんな感じ.

create table users (
user_id varchar(15) primary key,
user_pass varchar(15) not null,
user_name varchar(63)
user_role varchar(15) not null,
FOREIGN KEY(user_role) REFERENCES role(user_role)
);

create table role (
user_role varchar(15) primary key
);

この Users は user_role を必須にしてます.


-- 
<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 メーリングリストの案内