在利用注解開發資料庫持久層以前,需要學習一個規範JPA(Java Persistence API),這也是SUN公司提出的資料庫的持久化規範。就類似于JDBC,Servlet,JSP等規範一樣。而Hibernate架構就實作了此規範,我們可以通過注解和配置檔案來實作此規範。前邊的學習都是建立在配置檔案的基礎上,而注解開發現在也處于一種趨勢,畢竟它大大提高了開發速度。
看一下注解在Hibernate架構中的開發知識。
一,首先需要導入支援注解開發的jar包:
hibernate-annotations.jar
hibernate-commons-annotations.jar (Hibernate中支援注解開發的jar包)
ejb3-persistence.jar(API規範的jar包)
slf4j/slf4j-api-1.5.0.jar
slf4j-log4j12-1.5.0.jar
log4j-1.2.15.jar (支援日志輸出的jar包,注意版本的比對)
二,在Hibernate架構進行注解開發時,主要是代替實體和資料表的映射檔案,而核心配置檔案中的,資料庫的連接配接等等,還是需要xml配置檔案,進行配置的。先看一下Hibernate中常用的注解:
1,@Entity : 表示目前的類為實體類,聲明在類的前面。可以将目前類和資料庫的表和字段進行關聯映射。
2,@Table:表示映射的表,聲明在類的前面
3,@Id:表示主鍵的映射,聲明在主鍵的get方法前邊,預設情況下主鍵利用assigned(使用者提供)生成政策。如果想要設定API規範提供了四種主鍵生成政策:
@GeneratedValue(strategy=GenerationType.AUTO) 相當于Hibernate架構的native主鍵生成政策
@GeneratedValue(strategy=GenerationType.IDENTITY) 相當于Hibernate架構的identity主鍵生成政策,适用于MySQL,SQL Server
@GeneratedValue(strategy=GenerationType.SEQUENCE) 相當于Hibernate架構的sequence主鍵生成政策,适用于Oracle,DB2
@GeneratedValue(strategy=GenerationType.TABLE) 使用一張單表管理主鍵值。
預設情況下API規範是不支援Hibernate架構中的uuid的主鍵生成政策,假如我們想要使用,需要我們進行增加主鍵生成器,如下:
@GenericGenerator(name="hibernate-uuid",strategy="uuid")
@GeneratedValue(generator="hibernate-uuid")
4,@Column : 表示映射屬性,和表的字段進行關聯
5,@ManyToOne : 表示映射關系中的多對一
6,@JoinColumn : 表示外鍵映射屬性,和表的外鍵字段進行關聯
7,@OneToMany : 表示映射關系中的一對多,這裡需要注意,一對多時,外鍵的維護需要翻轉交給多的一方進行維護,需要配置反轉屬性mappedBy,屬性取值為多的一方的映射屬性名稱。相當于xml配置檔案中的Inverse="true"。
8,@OrderBy : 表示排序字段
9,@Transient : 表示聲明瞬時屬性,不和資料庫的字段發生關聯,也就是沒有表中列與之映射。
等等吧,其實我感覺這些屬性和xml配置檔案屬性都是一一對應的,及時不一樣,也會有與之類似的屬性進行實作其功能,是以我們可以對比着使用。當然這裡隻是一些常用的,當我們需要時還需要我們檢視文檔進行編寫。
三,看一個簡單的利用主鍵開發的實體類吧,這裡就不需要我們再編寫配置檔案了:
@Entity
@Table(name="t_org")
public class Org {
private String id;
private String name;
private String code;
private String manager;
private String remark;
private String createtime;
private String updatetime;
private OrgType orgType;
private String pid;
@Transient
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
private Org parentOrg;
private Set<Org> childOrgSet ;
@Id
@GenericGenerator(name="hibernate-uuid", strategy="uuid")
@GeneratedValue(generator="hibernate-uuid")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getManager() {
return manager;
}
public void setManager(String manager) {
this.manager = manager;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
@Column(updatable=false)
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
@Column(insertable=false)
public String getUpdatetime() {
return updatetime;
}
public void setUpdatetime(String updatetime) {
this.updatetime = updatetime;
}
@ManyToOne
@JoinColumn(name="orgTypeId")
public OrgType getOrgType() {
return orgType;
}
public void setOrgType(OrgType orgType) {
this.orgType = orgType;
}
@ManyToOne
@JoinColumn(name="pid", updatable=false)
public Org getParentOrg() {
return parentOrg;
}
public void setParentOrg(Org parentOrg) {
this.parentOrg = parentOrg;
}
@OneToMany(mappedBy="parentOrg")
@JoinColumn(name="pid")
@OrderBy("code")
public Set<Org> getChildOrgSet() {
return childOrgSet;
}
public void setChildOrgSet(Set<Org> childOrgSet) {
this.childOrgSet = childOrgSet;
}
}
四,當然用了注解的開發方式,我們的核心配置檔案就需要我修改了,這裡就需要Hibernate的AnnotationSessionFactoryBean工廠類了,
<!-- Hibernate核心對象 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<!--省略……-->
<!--指定進行了Hibernate注解開發的包,友善架構進行掃描設定-->
<property name="packagesToScan">
<list>
<value>com/ljh/ppp/domain</value>
</list>
</property>
這樣Hibernate架構的注解開發基本上就算完畢了,總體感覺是比較高效的。我們沒寫一個類一個方法,順便将注解編寫了,這樣我們就不用專門用來編寫映射檔案了。掌握好注解的開發,在很多時候可以大大提高我們的效率。當然還有其它架構的注解運用,後邊總結。