参考资料:《Hibernate_Reference》、《深入浅出Hibernate》
正文
下面我们将创建一个简单的基于控制台的(console-based)Hibernate应用程序。
我们所做的第一件事就是创建我们的开发目录,并且把所有需要用到的Java库文件放进去。万幸的是我们有了myeclipse,由他创建的工程可以很方便地打包,然后交给另一个同样拥有myeclipse的使用者,只需要简单的导入即可使用^_^
右键工程目录 → myeclipse → Add Hibernate……
这样子你的工程就可以导入Hibernate所需要的所有库文件,接下来我们创建一个类,用来代表那些我们希望储存在数据库里的event。
1.1
这里假设你已经拥有了一个数据库,并且尽量将数据库中的各种关联设置完毕,如果你能这样子做,接下来的事情将会变得非常简单^_^
打开透视图(perspective)中的myeclipse database exploer
在里面我们要配置下数据源

完成后即可建立连接,然后我们就可以用myec自带的工具进行映射配置,如下图:
1.2一路默认即可,最后将会生成一堆配置的文件一共有3类:
1.持久化类,就是一个带有一些属性(property)的简单JavaBean类如:
public abstract class AbstractTest implements java.io.Serializable {
// Fields
private Integer id;
private String name;
private Set<Testaddr> testaddr = new HashSet<Testaddr>(0);
public Set<Testaddr> getTestaddr() {
return testaddr;
}
public void setTestaddr(Set<Testaddr> testaddr) {
this.testaddr = testaddr;
}
/** default constructor */
public AbstractTest() {
}
/** full constructor */
public AbstractTest(Integer id, String name) {
this.id = id;
this.name = name;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
你可以看到这个类对属性的存取方法(getter and setter
method)使用了标准JavaBean命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的设计,但并不是必须的。
2.xml映射配置
Hibernate需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是Hibernate映射文件发挥作用的地方。映射文件告诉Hibernate它,应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。
一个映射文件的基本结构看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="HibernateFactory.Test" table="test"
catalog="himessage">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="true" />
</property>
<set name="testaddr" cascade="all" lazy="false" inverse="true">
<key column="test_id"></key>
<one-to-many class="HibernateFactory.Testaddr" />
</set>
</class>
</hibernate-mapping>
在hibernate-mapping
标签(tag)之间, 含有一个class
元素。所有的持久化实体类(再次声明,或许接下来会有依赖类,就是那些次要的实体)都需要一个这样的映射,来把类对象映射到SQL数据库里的表。
id
元素是标识符属性的声明,name="id"
声明了Java属性的名字 - Hibernate会使用getId()
和setId()
来访问它。 column
属性则告诉Hibernate, 我们使用EVENTS
表的哪个字段作为主键。嵌套的generator
元素指定了标识符生成策略,在这里我们指定native
,它根据已配置的数据库自动选择最佳的标识符生成策略。Hibernate支持由数据库生成,全局唯一性(globally
unique)和应用程序指定(或者你自己为任何已有策略所写的扩展)这些策略来生成标识符。
关于具体的配置请参阅《深入浅出Hibernate》P146 数据关联,所有的参数表请查此书P411
3.Hibernate配置
现在我们已经有了一个持久化类和它的映射文件,该是配置Hibernate的时候了。
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="show_sql">true</property>
<property name="connection.username">root</property>
<property name="connection.url">
jdbc:mysql://localhost/himessage?useUnicode=true&amp;characterEncoding=utf-8
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="myeclipse.connection.profile">Hb</property>
<property name="connection.password">1234</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<mapping resource="HibernateFactory/Admin.hbm.xml" />
<mapping resource="HibernateFactory/Test.hbm.xml" />
<mapping resource="HibernateFactory/Testaddr.hbm.xml" />
</session-factory>
</hibernate-configuration>
这里需要特别指出的是
<property name="show_sql">true</property>
用了这句我们可以直接在ec控制台看到Hibernate生成的sql语句,对调试程序是相当有帮助的!
示例的基本框架完成了 - 现在我们可以用Hibernate来做些真正的工作。
1.3我们终于可以使用Hibernate来加载和存储对象了,编写一个带有
main()
方法的
AdminActionr
类:
public class AdminAction {
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
session.beginTransaction();
Admin admin = new Admin();
admin.setEmail("tantan85@163.com");
admin.setName("tantan");
admin.setPsw("111111");
admin.setAddAdmin(2);
session.save(admin);
session.getTransaction().commit();
}
}
我们创建了个新的
Admin
对象并把它传递给Hibernate。现在Hibernate负责与SQL打交道,并把
INSERT
命令传给数据库。在运行之前,让我们看一下处理
Session
和
Transaction
的代码。
一个
Session
就是个单一的工作单元。我们暂时让事情简单一些,并假设Hibernate
Session
和数据库事务是一一对应的。
HibernateSessionFactory.getSession()是干什么的呢?返回“当前的”工作单元。
getTransaction()则表示取出一个事务对象,commit()则是事务的提交,即将缓存中的数据写入数据库。
就是这么面向对象的方法,你就完成了传统的sql语句的功能,是不是很爽?更爽的是你还可以用hql语言来完成更强大的功能,当然这里不可能一一列举,只有看书了,请参考《深入浅出Hibernate》P173 ^_^