在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配置,但是你有可能还会继续使用配置文件完成。