menu
書いてる野郎
orebike@gmail.com
@Entity @Table(name="hoge") public class Hoge extends Model{ @Id public long id; public String name; }
このように書く。 複合キーだけをあつめた Pk 的なクラスを作りそこに Embeddable アノテーションをつけて、hashCode と equals を実装する。 そのクラスを Entity に IdClass アノテーションで指定して、その PK と同じフィールドを Entity にもつけて Id アノテーションをつけておけばよい。
このような複合キーのテーブルは関連テーブルに多く、Java上は別に複合にしておく必要もないように見えるが、 OneToOne 結合等をやる場合に ID を所持していない側へのマッピングができないという動きにになるので、やっとく必要がある。
この作例では面倒なので内部クラスに書いているが、ボイラープレートコードなので、別ファイルに書いておいたほうが見た目はいいと思う。
@Entity @Table(name="hoge") @IdClass(FugaPk.class) public class Fuga extends Model{ @Embeddable public static class FugaPk{ private long hoge_id; private long piyo_id; public FugaPk(long hoge_id, long piyo_id) { this.hoge_id = hoge_id; this.piyo_id = piyo_id; } public long getHoge_id() { return hoge_id; } public void setHoge_id(long hoge_id) { this.hoge_id = hoge_id; } public long getPiyo_id() { return piyo_id; } public void setPiyo_id(long piyo_id) { this.piyo_id = piyo_id; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (int) (hoge_id ^ (hoge_id >>> 32)); result = prime * result + (int) (piyo_id ^ (piyo_id >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; FugaPk other = (FugaPk) obj; if (hoge_id != other.hoge_id) return false; if (piyo_id != other.piyo_id) return false; return true; } } @Id public long hoge_id; @Id public long piyo_id; }