1. hibernate简介
Hibernate是一种功能强大,执行性高的面向对象的持久化技术。Hibernate可以使你很容易的以面向对象的方式来开发持久化类,包括联合,继承,多态,组合和集合。Hibernate允许你像使用本地SQL语句或面向对象的标准和示例API一样轻松的使用其自带的SQL表达式(HSQL).
并不像许多其他持久化解决方案一样,Hibernate 并不屏弃你已拥有的SQL的威力,并保证你投入的关系型技术和知识依然可用。
2.Hibernate之hello world
首先,我们来创建一个简单基于控制台的Hibernate 应用程序。我们将使用一个java database(HSQL DB),因此不需要安装任何数据库服务器。
假设我们需要一个小型的数据库来存储我们将要参加的活动,和这些活动的举办者的 一些信息。
首先,建立一个工作目录,并将需要用到的java类库放进工作目录中。下载Hibernate,并从其lib目录中将需要的jar文件解压到我们刚建的工作目录中的lib文件夹下。应该包含下面的一些jar文件:
.
+lib
antlr.jar
cglib.jar
asm.jar
asm-attrs.jars
commons-collections.jar
commons-logging.jar
hibernate3.jar
jta.jar
dom4j.jar
log4j.jar
这是当前的hibernate需要的最小的类库集合。在hibernate的lib文件夹中的readme.txt文件中有对各个jar文件的说明,下面将该文件列出,以方便查看:
ehcache-1.1.jar (1.1)
- EHCache cache
- runtime, optional (required if no other cache provider is set)
versioncheck.jar (1.0)
- version checker
- buildtime
swarmcache-1.0rc2.jar (1.0rc2)
- runtime, optional
- runtime, optional
jboss-cache.jar ( 1.2.2 a lpha)
- TreeCache clustered cache
- runtime, optional
jgroups- 2.2.8 .jar (2.2.8)
- JGroups multicast library
- runtime, optional (required by replicated caches)
jta.jar (unknown)
- Standard JTA API
- runtime, required for standalone operation (outside application server)
xml-apis.jar (unknown)
- Standard JAXP API
- runtime, some SAX parser is required
commons-logging- 1.0.4 .jar (1.0.4)
- Commons Logging
- runtime, required
c3p0- 0.9.0 .jar (0.9.0)
- C3P0 JDBC connection pool
- runtime, optional
connector.jar (unknown)
- Standard JCA API
- runtime, optional
jboss-system.jar (unknown)
- unknown name
- runtime, optional (required by TreeCache)
asm-attrs.jar (unknown)
- ASM bytecode library
- runtime, required
jacc-1_0-fr.jar (1.0-fr)
- JACC Library
- runtime, optional
checkstyle-all.jar (unknown)
- Checkstyle
- buildtime
log4j- 1.2.11 .jar (1.2.11)
- Log4j Library
- runtime, optional
junit- 3.8.1 .jar (3.8.1)
- JUnit test framework
- buildtime
dom4j- 1.6.1 .jar (1.6.1)
- XML configuration & mapping parser
- runtime, required
antlr- 2.7.6 rc1.jar (2.7.6rc1)
- ANother Tool for Language Recognition
- runtime, required
cglib- 2.1.3 .jar (2.1.3)
- CGLIB bytecode generator
- runtime, required
jboss-common.jar (unknown)
- unknown name
- runtime, optional (required by TreeCache)
oscache-2.1.jar (2.1)
- OpenSymphony OSCache
- runtime, optional
asm.jar (unknown)
- ASM bytecode library
- runtime, required
ant-launcher- 1.6.5 .jar (1.6.5)
- Ant launcher
- buildtime
jaas.jar (unknown)
- Standard JAAS API
- runtime, optional (required by JCA)
jdbc2_0-stdext.jar (2.0)
- Standard Extension JDBC APIs
- runtime, required for standalone operation (outside application server)
ant-antlr- 1.6.5 .jar (1.6.5)
- Ant antlr support
- buildtime
jboss-jmx.jar (unknown)
- unknown name
- runtime, optional (required by TreeCache)
cleanimports.jar (unknown)
- cleanimports
- buildtim
xerces- 2.6.2 .jar (2.6.2)
- SAX parser
- runtime, required for JDK < 1.4
jaxen-1.1-beta-7.jar (1.1-beta-7)
- Jaxen - universal java xpath engine
- runtime, required if you want to deserialize a Configuration to improve startup performance
ant-junit- 1.6.5 .jar (1.6.5)
- Ant junit support
- buildtime
ant-swing- 1.6.5 .jar (1.6.5)
- Ant swing support
- buildtime
commons-collections- 2.1.1 .jar (2.1.1)
- Commons Collections
- runtime, required
ant- 1.6.5 .jar (1.6.5)
- Ant core
- buildtime
proxool- 0.8.3 .jar (0.8.3)
- Proxool JDBC connection pool
- runtime, optional
concurrent- 1.3.2 .jar (1.3.2)
- unknown name
- runtime, optional (required by TreeCache)
syndiag2.jar (2.0)
- antlr to bnf image generator
- buildtime
Next we create a class that represents the event we want to store in database.
接下来,我们创建一个类来表示我们将要存储在数据库中的活动。
1.2.1 . The first class
一个简单的javabean:
package events;
import java.util.Date;
public class Event
{
private Long id;
private String title;
private Date date;
public Event() {}
public Long getId()
{
return id;
}
private void setId(Long id)
{
this.id = id;
}
public Date getDate()
{
return date;
}
public void setDate(Date date)
{
this.date = date;
}
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
}
这是一个标准的javabean的命名方式,属性都带有getter和setter方法,以及对属性字段的private的访问修饰。这是一种值得推荐的方式。Hibernate可以直接访问属性,访问函数的好处是在重构时能够使程序很健壮。
Id是一项活动的唯一的标识符。如果想要完全发挥Hibernate的作用,则需要使每一个持久性实体类都具备一个唯一的标识字段。当我们不应该设置一个属性的值时,应该将其setter方法设为private。此时,Hibernate在一个对象存储时才会为该字段设值。Hibernate不仅可以访问private、public、protenct的方法,同样也可以直接访问(public,private,protenct)变量。
每个持久化类必须提供一个无参的构造函数。此构造函数可以声明为private,但是当运行代理产生器和有效的数据恢复时必须提供包可见性的构造函数。
将此文件放置在工作目录的src目录下:
.
+lib
<Hibernate and third-party libraries>
+src
+events
Event.java