在Hibernate设计的初期,考虑到配置文件与程序相分离的特点,所以来讲定义出了一系列的*.hbm.xml文件目的是让简单java类与数据表的字段进行一个有效的验证,
可是却产生了一个严重的问题--在任何一个中大型的项目之中,数据表至少会存在有几百个,如果所有的简单Java类都要定义一个完全与之对应的*.hbm.xml文件,那么这回项目就乱了,整个项目完成之后就同时存在有几百个配置文件,要从几百个配置文件之中选择所需要的内容,并且很多时候还会存在有关联问题.
随后在Java行业内考虑到了数据层的操作问题,所以推出了一个JPA的操作标准(Java持久 化API),在JPA里面提供有一系列的Annotation的配置操作,也就是说利用Annotation就可以实现与*.hbm.xml文件理论上等价的形式,现在的Hibernte开发很少再去直接使用*.hbm.xml文件完成,全部都使用Annotation的配置完成,
特别需要提示的:在行业之中还有一个JAP的开发框架,如果已经清楚了Hibernate的所有Annotation的配置,你就会使JPA了,也就会使EJB3.x了
Hibernate从3.2版本增加了Annotation的支持,
选择这个随后就将生成支持与Annotation(JPA标准)的POJO类
当添加完Annotation支持的映射操作之后,首先会发现在hiberante.cfg.xml文件里面出现如下配置
<mapping class="cn.zwb.pojo.Member" />
那么随后最关键的部分就在于POJO类的生成上了.
package cn.zwb.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; @Entity //表示这个一个数据实体类型 @Table(name = "member", catalog = "aaa") //映射的数据表名称 public class Member implements java.io.Serializable { // Fields private String mid; private String name; private Integer age; private Double salary; private Date birthday; private String note; // Constructors /** default constructor */ public Member() { } /** minimal constructor */ public Member(String mid) { this.mid = mid; } /** full constructor */ public Member(String mid, String name, Integer age, Double salary, Date birthday, String note) { this.mid = mid; this.name = name; this.age = age; this.salary = salary; this.birthday = birthday; this.note = note; } // Property accessors @Id //设置主键属性 @Column(name = "mid", //主键列的名称 unique = true, //是否为唯一 nullable = false, //是否允许为空 length = 50) //字段长度 public String getMid() { //setter没有变化 return this.mid; } public void setMid(String mid) { this.mid = mid; } @Column(name = "name", length = 50) public String getName() { return this.name; } public void setName(String name) { this.name = name; } @Column(name = "age") public Integer getAge() { return this.age; } public void setAge(Integer age) { this.age = age; } @Column(name = "salary", precision = 22, scale = 0) public Double getSalary() { return this.salary; } public void setSalary(Double salary) { this.salary = salary; } @Temporal(TemporalType.DATE) //定义的是一个日期型的操作 @Column(name = "birthday", length = 10) public Date getBirthday() { return this.birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Column(name = "note", length = 65535) public String getNote() { return this.note; } public void setNote(String note) { this.note = note; } }
整个JPA的标准就是直接在简单Java类上明确的表示出每一个getter()方法对应的数据列.
范例:测试程序
package cn.zwb.test; import java.util.Date; import cn.zwb.dbc.HibernateSessionFactory; import cn.zwb.pojo.Member; public class TestMemberInsert { public static void main(String[] args) { Member member=new Member(); member.setMid("啦啦啦"); member.setAge(13); member.setBirthday(new Date()); member.setName("zwb"); member.setNote("66666"); System.out.println(HibernateSessionFactory.getSession().save(member)); HibernateSessionFactory.getSession().beginTransaction().commit(); HibernateSessionFactory.closeSession(); } }
使用Annotation配置的项目更加的简单