10 08Hibernate之利用Annotation開發

在Hibernate的設計初期,考慮到配置文件與程序相分離的特點,所以來講定義出了一系列的*.hbm.xml文件,目的是讓簡單Java類與數據表的字段進行一個有效的驗證,可是卻產生了一個嚴重的問題——在任何一箇中大型項目之中,數據表至少會存在有幾百個,那麼如果所有的簡單Java類都要定義一個與之完全對應的*.hbm.xml文件,那麼這回項目就亂了。整個項目完成之後就同時存在有幾百個配置文件,如果要修改,要從幾百個配置文件之中選擇所需要的內容,並且很多時候還會存在有關聯問題。

隨後在Java行業內考慮到了數據層的操作問題,所以推出了一個JPA的操作標準(Java持久化API),在JPA裏面提供有一系列的Annotation的配置操作,也就是說利用Annotation就可以實現與*.hbm.xml文件理論上等價的形式。現在的Hibernate開發很少再去直接使用*.hbm.xml文件完成,全部使用Annotation的配置完成。

特別需要提示的:在行業之中還有一個JPA的開發框架,如果你已經清楚了Hibernate的所有Annotation配置,你就會使用JPA了,也就會使用EJB 3.x。

Hibernate從3.2版本開始增加了Annotatio的支持,也就是說只要是你的項目添加的Hibernate版本爲3.2或以上都可以直接使用Annotation實現配置。

所有的Annotation的支持配置都是在創建映射轉換的時候使用的。
那麼隨後就將生成支持於Annotation(JPA標準)的POJO類。

當添加完Annotation支持的映射操作之後,首先會發現在hibernate.cfg.xml文件裏面出現瞭如下配置:

<mapping class="org.lks.pojo.Member" />

那麼隨後最關鍵的部分就在於POJO類的生成了。

package org.lks.pojo;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@SuppressWarnings("serial")
@Entity   //表示這是一個數據實體類型
@Table(name = "member", catalog = "hedb")  //映射的數據表名稱
public class Member implements java.io.Serializable {

	// Fields

	private String mid;
	private String mname;
	private Integer mage;
	private Double msalary;
	private Date mbirthday;
	private String mnote;

	// Constructors

	/** default constructor */
	public Member() {
	}

	/** minimal constructor */
	public Member(String mid) {
		this.mid = mid;
	}

	/** full constructor */
	public Member(String mid, String mname, Integer mage, Double msalary, Date mbirthday, String mnote) {
		this.mid = mid;
		this.mname = mname;
		this.mage = mage;
		this.msalary = msalary;
		this.mbirthday = mbirthday;
		this.mnote = mnote;
	}

	// Property accessors
	@Id  //設置主鍵屬性
	@Column(	//定義
			name = "mid", //主鍵列的名稱
			unique = true,   //是否唯一
			nullable = false,  //是否允許爲空
			length = 50)  //字段長度
	public String getMid() { //此方法返回的內容爲主鍵列
		return this.mid;
	}

	public void setMid(String mid) {
		this.mid = mid;
	}

	@Column(name = "mname", length = 50)  //定義mname列的映射
	public String getMname() {
		return this.mname;
	}

	public void setMname(String mname) {
		this.mname = mname;
	}

	@Column(name = "mage")
	public Integer getMage() {
		return this.mage;
	}

	public void setMage(Integer mage) {
		this.mage = mage;
	}

	@Column(name = "msalary", precision = 22, scale = 0)
	public Double getMsalary() {
		return this.msalary;
	}

	public void setMsalary(Double msalary) {
		this.msalary = msalary;
	}

	@Temporal(TemporalType.DATE)  //定義的是一個日期類型的字段
	@Column(name = "mbirthday", length = 10)
	public Date getMbirthday() {
		return this.mbirthday;
	}

	public void setMbirthday(Date mbirthday) {
		this.mbirthday = mbirthday;
	}

	@Column(name = "mnote", length = 65535)
	public String getMnote() {
		return this.mnote;
	}

	public void setMnote(String mnote) {
		this.mnote = mnote;
	}

}

整個JPA的標準就是直接在簡單Java類上明確的表示出每一個getter()方法對應的數據列。
範例:測試程序

package org.lks.test;

import java.text.SimpleDateFormat;

import org.lks.dbc.HibernateSessionFactory;
import org.lks.pojo.Member;

public class TestMemberInsert {
	public static void main(String[] args) throws Exception {
		Member member = new Member();
		member.setMid("3181301102");	
		member.setMname("hhy");
		member.setMage(20);
		member.setMbirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1999-08-21"));
		member.setMsalary(10000.0);
		member.setMnote("big fool!");
		System.out.println(HibernateSessionFactory.getSession().save(member));
		HibernateSessionFactory.getSession().beginTransaction().commit();
		HibernateSessionFactory.closeSession();
		System.exit(0);
	}
}

使用Annotation配置的項目更加的簡單。

在以後的開發之中,如果是新的項目強烈建議使用Annotation配置,但是你有可能還會繼續使用配置文件完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章