Hibernate注解的方式使用還不太熟悉,現将學習筆記記錄如下:
一對多雙向關聯的注解實作:
現有DashboardWindow 和 DashboardWinParam 兩個實體,是父子關系
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方法用于判斷兩個對象是否相同,EntityManger通過find方法來查找Entity 時,是根據equals的傳回值來判斷的。本例中,隻有對象的name和email值完全相同時或同一個對象時則傳回true,否則傳回false。 hashCode方法傳回目前對象的哈希碼,生成的hashCode相同的機率越小越好,算法可以進行優化。