[Seasar-user:5799] Re: [KuinaDao]Kuinaと複合と主キーと私

T.N [E-MAIL ADDRESS DELETED]
2007年 1月 21日 (日) 14:45:59 JST


中村友則です。

 返信ありがとうございます。

> Dolteng も複合主キーのことはほとんど考慮していないので
> 漏れていますが,この場合はクラスに @IdClass アノテーションが
> 必要です.それがないために Hibernate に type フィールドが
> 無視されているように見えます.
> MyTypeId のようなクラスを作成して,それを @IdClass で
> 指定すれば,とりあえず
>>public List<MtType> findByProperties(MtType mtType);
> このメソッドは動くような気がします(確認してませんが).

 @idClassをつけたPKクラスを作って試してみました。
まずPKクラスを作成し、
public class MtTypePK implements Serializable {
    private Long id;
    private String type;
    public Long getId() {        return id;    }
    public String getType() {        return type;    }
    public MtTypePK() {}
    public MtTypePK(Long id, String type) {
   this.id = id;     this.type = type;    }
}
MtTypeに@idClassを追加してみました。
@Entity
@IdClass(jp.co.school.entity.MtTypePK.class)
public class MtType {
    @Id    private Long id;
    @Id    private String type;
...(省略)
}
そして前回と同様に実行してみると
以下のメッセージが表示されエラーになりました。

END
jp.co.school.web.impl.MtTypeServiceImpl#findByParameter([E-MAIL ADDRESS DELETED])
Throwable:java.lang.NullPointerException
END jp.co.school.web.student.StudentMenuPage#initialize()
Throwable:java.lang.NullPointerException
 typeのみが設定されていてidがnullになっていたせいかと思いましたが
idに値を設定していても同様になりました。

 一応以下のメソッドは正常に検索できました。
entityManager.find(MtType.class, new MtTypePK(Long.valueOf(0), "S"));

> 正直なところ,JPA で複合主キーを使ってもいいことは
> 何もないと思っているので,積極的にサポートするかは
> 微妙です.
 おっしゃるとおりで、まず複合主キーを使わないといけないような
テーブル設計がいけないんでしょうね;;
 とりあえずSQL,JPQLを使うか、DB設計を見直してみることにします。

> あと,本題とは関係ありませんが,主キーにプリミティブ型を
> 使うのは Kuina-Dao 的に推奨しません.
> 上の例だと,findByProperties() で渡す MtType は主キーである
> id が null にならないため必ず問い合わせ条件に含まれてしまい,
> あまり役に立たないものになってしまいます.
 なるほど、idをLong型にすればよいわけですね。

以上宜しくお願いします。



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