1.抽象基類
每個實體Bean都有一些類似的欄位,例如id,version等,所以可以抽象出一個基類來。
package org.bnuitse.tms.model;
import java.io.Serializable;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;
@MappedSuperclass
public abstract class AbstractEntityBean implements IEntityBean, Serializable {
private static final long serialVersionUID = 1L;
protected int id;
private int version;
public AbstractEntityBean() {
}
public void setId(int id) {
this.id = id;
}
@Version
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
}
@MappedSuperclass用於標識AbstractEntityBean中的資料欄位也用於持久化。
IEntityBean是一個介面,用於會話Bean進行統一處理。見《教學管理系統-會話Bean》。
package org.bnuitse.tms.model;
public interface IEntityBean {
int getId();
}
2.具體類
具體類需要定義從介面繼承來的抽象方法getId(),原因是每個具體類對應資料庫的主鍵名稱、產生方式可能不同,需要在getId()方法上用@Column進行標識。
一對多資料,例如classes和depts,如果想要處理簡單些,可以用Hibernate的DELETE_ORPHAN進行標識,具體含義見Hibernate文檔。
一對多資料提供了addXxx和removeXxx方法,為的是進行aspect編程,見《教學管理系統-面向方面的編程》。
一對多資料通常是消極式載入。可以在查詢語句中使用fetch載入lazy data。為了使用方便,自訂一個annotation稱為@EagerlyFetchQuery,在會話Bean中會尋找它,執行裡面定義的查詢。
private static final long serialVersionUID欄位需要定義,原因有二:一是如果一個類實現Serializable介面,推薦定義該欄位;二是當aspectj織入代碼產生新類時,如果沒有定義該欄位,會自動產生一個新的serialVersionUID值(見java.io),這樣,UI從伺服器端取出的資料和本地類的版本號碼不同,將產生異常。
package org.bnuitse.tms.model.security;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import org.bnuitse.tms.model.AbstractEntityBean;
import org.bnuitse.tms.model.EagerlyFetchQuery;
@Entity
@Table(name = "org_college")
@EagerlyFetchQuery("from College o left join fetch o.classes left join fetch o.depts where o.id = :id")
public class College extends AbstractEntityBean {
private static final long serialVersionUID = -8443100575405647610L;
private String name;
private List<CollegeClass> classes = new ArrayList<CollegeClass>();
private List<CollegeDept> depts = new ArrayList<CollegeDept>();
@Id
@Column(name="collegeId")
@TableGenerator(name = "CollegeGen", table = "pub_keygen", pkColumnName = "keyid", valueColumnName = "keyvalue", pkColumnValue = "College", allocationSize = 10, initialValue = 10000)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "CollegeGen")
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(mappedBy = "college", cascade = CascadeType.ALL)
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
public List<CollegeClass> getClasses() {
return classes;
}
public void setClasses(List<CollegeClass> classes) {
this.classes = classes;
}
public void addClass(CollegeClass collegeClass) {
collegeClass.setCollege(this);
this.classes.add(collegeClass);
}
public void removeClass(CollegeClass collegeClass) {
this.classes.remove(collegeClass);
}
@OneToMany(mappedBy = "college", cascade = CascadeType.ALL)
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
public List<CollegeDept> getDepts() {
return depts;
}
public void setDepts(List<CollegeDept> depts) {
this.depts = depts;
}
public void addDepartment(CollegeDept collegeDept) {
collegeDept.setCollege(this);
this.depts.add(collegeDept);
}
public void removeDepartment(CollegeDept collegeDept) {
this.depts.remove(collegeDept);
}
public String toString() {
return this.getId() + "-" + this.name;
}
}