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