第五步:建立你的第一个可持久化的类。
Hibernate 让普通的Java 对象(Plain Old Java Objects ,就是POJOs,有时候也称作Plain
Ordinary Java Objects)变成持久化类。一个POJO 很像JavaBean,属性通过getter 和setter
方法访问,对外隐藏了内部实现的细节。
package net.sf.hibernate.examples.quickstart;
public class Cat {
private String id;
private String name;
private char sex;
private float weight;
public Cat() {
}
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 char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
}
第六步:映射Cat
Cat.hbm.xml 映射文件包含了对象/关系映射所需的元数据。
元数据包含了持久化类的声明和把它与其属性映射到数据库表的信息(属性作为值或者是指向
其他实体的关联)。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="net.sf.hibernate.examples.quickstart.Cat" table="CAT">
<id name="id" type="string" unsaved-value="null" >
<column name="CAT_ID" sql-type="char(32)"/>
<generator class="uuid.hex"/>
</id>
<property name="name">
<column name="NAME" sql-type="varchar(16)"/>
</property>
<property name="sex"/>
<property name="weight"/>
</class>
</hibernate-mapping>
每个持久化类都需要一个标识属性(实际上,只是哪些代表一手对象的类,而不是代表值对象
的类,后者会被映射称为一手对象中的一个组件)。这个属性用来区分持久化对象:如果
catA.getId().equals(catB.getId())结果是true 的话,两只猫就是相同的。这个概念称为
数据库标识。Hiernate 附带了几种不同的标识符生成器,用于不同的场合(包括数据库本地的
顺序(sequence)生成器和hi/lo 高低位标识模式)。我们在这里使用UUID 生成器,并指定CAT
表的CAT_ID 字段(作为表的主键)存放生成的标识值
第七步:在数据库中建立cat表:
运行下面的SQL:
create table CAT(cat_id character(32) not null, name varchar(32), weight real,sex character(1),constraint pk_CAT primary key (cat_id));
第八步:编写测试页面:
<%@ page import="net.sf.hibernate.*"%>
<%@ page import="net.sf.hibernate.cfg.*"%>
<%@ page import="net.sf.hibernate.examples.quickstart.*"%>
<%
SessionFactory sessionFactory =new Configuration().configure().buildSessionFactory();
Session sess = sessionFactory.openSession();
Transaction tx= sess.beginTransaction();
Cat princess = new Cat();
princess.setName("Princess");
princess.setSex('F');
princess.setWeight(7.4f);
sess.save(princess);
tx.commit();
HibernateUtil.closeSession();
out.println("Cat set OK!");
%>
访问一下这个页面看看吧,在看看你的数据库是不是多了一条数据。
现在略微解释一下这段代码:
1、SessionFactory 负责一个数据库,也只对应一个XML 配置文件(hibernate.cfg.xml)。
2、Session 不是线程安全的,代表与数据库之间的一次操作。Session 通过SessionFactory 打
开,在所有的工作完成后,需要关闭:HibernateUtil.closeSession();
3、在Session 中,每个数据库操作都是在一个事务(transaction)中进行的,这样就可以隔离开不同的操作(甚至包括只读操作)。我们使用Hibernate 的Transaction API 来从底层的事务策略中(本例中是JDBC 事务)脱身。这样,如果需要把我们的程序部署到一个由容器管理事务的环境中去(使用JTA),我们就不需要更改源代码。请注意,我们上面的例子没有处理任何异常。
好了,访问以下看看吧。http://localhost/cat/cat.jsp