注記方式Hibernateの双方向一対多関係のマッピングを実現
Hibernate注記の使い方はまだよく知られていませんが、学習ノートを以下のように記録します.
複数の双方向に関連付けられた注釈のペア:
既存のDashboardWindowとDashboardWinParamの2つのエンティティは、親子関係です.
DashboardWindow(一端):
DashboardWinParam(マルチエンド):
@IdClassコメントで複合プライマリ・キーをエンティティに表示します.
PKWinParam:
@JoinColumn(name="WIN_ID")はDashboardWinParamの外部キーWIN_を示すID、DashboardWindowへのプライマリ・キー・カラムWIN_ID
プライマリ・キー・クラスとしては、以下の要件を満たす必要があります.
l Serializableインタフェースを実装する必要があります.
lデフォルトのpublic無パラメータの構築方法が必要です.
l equalsメソッドとhashCodeメソッドを上書きする必要があります.equalsメソッドは2つのオブジェクトが同じかどうかを判断するために用いられ,EntityMangerがfindメソッドでEntityを検索する場合,equalsの戻り値に基づいて判断される.この例では、オブジェクトのnameとemailの値が完全に同じ場合、または同じオブジェクトの場合にのみtrueが返され、そうでなければfalseが返されます.hashCodeメソッドは、現在のオブジェクトのハッシュコードを返し、生成されたhashCodeと同じ確率が小さいほどアルゴリズムを最適化することができる.
複数の双方向に関連付けられた注釈のペア:
既存のDashboardWindowとDashboardWinParamの2つのエンティティは、親子関係です.
DashboardWindow(一端):
@Entity
@Table(name="SYS_DASHBOARD_WINDOW")
public class DashboardWindow {//corresponding to APPData
@Id
@Column(name="WIN_ID")
@GenericGenerator(name = "WIN_ID", strategy = "assigned")
private long id;
@Column(name="WIN_NAME",length=30)
private String name;
@Column(name="WIN_STATUS")//0-Normal 1-Min 2-Max
private int status;
@Column(name="WIN_INDEX")
private int index;
@Column(name="DASHBOARD_ID")
private long parentDsbId;
@Column(name="WIN_X")
private int winX;
@Column(name="WIN_Y")
private int winY;
@Column(name="WIN_HEIGHT")
private int winHeight;
@Column(name="WIN_WIDTH")
private int winWidth;
@Column(name="APP_URL",length=255)
private String appUrl;
@Column(name="MODIFY_DATE")
private Timestamp modifyDate;
@OneToMany(mappedBy="dashboardWindow",cascade={CascadeType.ALL},fetch=FetchType.EAGER)
private Set<DashboardWinParam> dashboardWinParams;
public Set<DashboardWinParam> getDashboardWinParams() {
if(dashboardWinParams == null){
dashboardWinParams = new HashSet<DashboardWinParam>();
}
return dashboardWinParams;
}
public void setDashboardWinParams(Set<DashboardWinParam> dashboardWinParams) {
this.dashboardWinParams = dashboardWinParams;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public long getParentDsbId() {
return parentDsbId;
}
public void setParentDsbId(long parentDsbId) {
this.parentDsbId = parentDsbId;
}
public int getWinX() {
return winX;
}
public void setWinX(int winX) {
this.winX = winX;
}
public int getWinY() {
return winY;
}
public void setWinY(int winY) {
this.winY = winY;
}
public int getWinHeight() {
return winHeight;
}
public void setWinHeight(int winHeight) {
this.winHeight = winHeight;
}
public int getWinWidth() {
return winWidth;
}
public void setWinWidth(int winWidth) {
this.winWidth = winWidth;
}
public String getAppUrl() {
return appUrl;
}
public void setAppUrl(String appUrl) {
this.appUrl = appUrl;
}
public Timestamp getModifyDate() {
return modifyDate;
}
public void setModifyDate(Timestamp modifyDate) {
this.modifyDate = modifyDate;
}
}
DashboardWinParam(マルチエンド):
@IdClassコメントで複合プライマリ・キーをエンティティに表示します.
@Entity
@Table(name="SYS_DASHBOARD_WIN_PARAM")
@IdClass(PKWinParam.class)
public class DashboardWinParam {
private String name;
private String value;//default value
private DashboardWindow dashboardWindow;
@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="PARAM_VALUE",nullable=false,length=255)
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Id
public DashboardWindow getDashboardWindow() {
return dashboardWindow;
}
public void setDashboardWindow(DashboardWindow dashboardWindow) {
this.dashboardWindow = dashboardWindow;
}
}
PKWinParam:
@JoinColumn(name="WIN_ID")はDashboardWinParamの外部キーWIN_を示すID、DashboardWindowへのプライマリ・キー・カラムWIN_ID
@Embeddable
public class PKWinParam implements Serializable {
private DashboardWindow dashboardWindow;
private String name;
@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name="WIN_ID",referencedColumnName="WIN_ID",nullable=false)
public DashboardWindow getDashboardWindow() {
return dashboardWindow;
}
public void setDashboardWindow(DashboardWindow dashboardWindow) {
this.dashboardWindow = dashboardWindow;
}
@Column(name="PARAM_NAME",nullable=false,length=50)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null)
return false;
if (!(o instanceof PKWinParam))
return false;
PKWinParam pk = (PKWinParam) o;
if (this.dashboardWindow.getId() == pk.getDashboardWindow().getId() && this.name.equals(pk.getName())) {
return true;
}
return true;
}
@Override
public int hashCode() {
return 31 * this.dashboardWindow.hashCode() + this.name.hashCode();
}
}
プライマリ・キー・クラスとしては、以下の要件を満たす必要があります.
l Serializableインタフェースを実装する必要があります.
lデフォルトのpublic無パラメータの構築方法が必要です.
l equalsメソッドとhashCodeメソッドを上書きする必要があります.equalsメソッドは2つのオブジェクトが同じかどうかを判断するために用いられ,EntityMangerがfindメソッドでEntityを検索する場合,equalsの戻り値に基づいて判断される.この例では、オブジェクトのnameとemailの値が完全に同じ場合、または同じオブジェクトの場合にのみtrueが返され、そうでなければfalseが返されます.hashCodeメソッドは、現在のオブジェクトのハッシュコードを返し、生成されたhashCodeと同じ確率が小さいほどアルゴリズムを最適化することができる.