Hibernate作为ORM框架的一个强大实现,配置文件是必不可少的。.NET中对ORM框架的实现,用的是EntityFramework,Java这边则是Hibernate。在说Hibernate配置文件之前,先说说EF的配置文件,这样有个共鸣。
EF的配置文件主要有这么三部分:
1、连接数据库
连接数据库需要数据库驱动,数据库服务,用户名和密码。
2、映射数据库
EF和数据库的交互有三种模式,ModelFirst、CodeFirst和DBFirst,可以先建成数据库,然后用EF来和数据库建立关系;同样也可以先生成Model,然后用Model映射建立数据库。
3、实体对象映射
ORM,实体关系映射,通过名字就可以看出来,它是把数据库以实体对象的形式展现,采用面向对象的方式。数据库表之间的关系,也就自然映射成了实体对象之间的关系。在这个过程中,实体对象类是必不可少的,同样实体关系也是必不可少的。
那么在Hibernate做实体关系映射时,同样需要这三部分。
1、连接数据库
<!--数据库驱动--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!--数据库服务,也就是连接数据库所需要的地址--> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_one2one_pk_1</property> <!--数据库的用户名--> <property name="hibernate.connection.username">root</property> <!--数据库的密码--> <property name="hibernate.connection.password">123456</property> <!--数据库方言--> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
Hibernate连接数据库同样也是这几部分,数据库驱动、数据库服务、用户名和密码。不同的数据库有不同的驱动,连接地址的书写方式也不太一样,在hibernate.properties文件中,各种数据库的连接方式都有,需要的话可以去查询。
最后一个数据库方言,其实也很好理解。不同的数据库SQL语句的写法或执行方式有些不一样,比如mysql的分页查询需要关键字limit,Oracle的分页查询则需要rownum,所以Hibernate为了支持不同数据库生成SQL语句,就给不同的数据库设置了方言,以作区分。
2、映射数据库
如果说先建好库,然后写Hibernate,那么这一步就可以省略掉了。如果是用Hibernate生成数据库表,那这一步就要好好做。
在hibernate.cfg.xml中有这么一个属性:
<property name="hibernate.hbm2ddl.auto">update</property>
这个属性的意思就是,设置hbm文件到ddl文件为update,也就是通过hbm文件生成ddl文件,然后创建数据库表。首先要创建一个库,然后连接这个库,接着创建实体类,并在实体类目录下添加实体映射文件,也就是hbm文件,在hbm文件中设置好表名列名等内容之后,就可以通过它来创建数据库表,这也就是所谓的映射文件。
3、实体对象映射
这一步就是要映射实体对象了,将每一张表映射为一个实体。首先需要建立一个实体类,然后给该实体类写配置文件。
public class User { private String id; private String name; private String password; 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 String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
<hibernate-mapping> <class name="com.tgb.User" table="t_user"> <id name="id"> <generator class="uuid"/> </id> <property name="name"/> <property name="password"/> <property name="createTime"/> <property name="expireTime"/> </class> </hibernate-mapping>
把实体类和映射文件创建好之后,把映射文件添加到hibernate.cfg.xml文件中就好了。
<mapping resource="com/tgb/User.hbm.xml"/>
Hibernate的配置文件有两种,一是hibernate.cfg.xml,而是hbm.xml文件。
hibernate.cfg.xml文件是Hibernate一个总的配置文件,Hibernate工作就是从这个配置文件入手的。首先它应该配置它相应的DTD文件,然后是一个标签标识配置文件的开始,接着就是配置文件里面的详细内容,包括数据库的配置、Hibernate特殊用途的配置、映射文件的配置等。
<!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' encoding='gb2312'?> <!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3软件包中的src\org\hibernate目录中找到此文件--> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <!--声明Hibernate配置文件的开始--> <hibernate-configuration> <!--表明以下的配置是针对session-factory配置的,SessionFactory是Hibernate中的一个类,这个类主要负责保存HIbernate的配置信息,以及对Session的操作--> <session-factory> <!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property> <!--设置数据库的连接url:jdbc:mysql://localhost/hibernate,其中localhost表示mysql服务器名称,此处为本机,hibernate是数据库名--> <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate </hibernate> <!--连接数据库是用户名--> <property name="hibernate.connection.username">root </property> <!--连接数据库是密码--> <property name="hibernate.connection.password">123456 </property> <!--数据库连接池的大小--> <property name="hibernate.connection.pool.size">20 </property> <!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于差错,程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率--> <property name="hibernate.show_sql">true </property> <!--jdbc.fetch_size是指Hibernate每次从数据库中取出并放到JDBC的Statement中的记录条数。Fetch Size设的越大,读数据库的次数越少,速度越快,Fetch Size越小,读数据库的次数越多,速度越慢--> <property name="jdbc.fetch_size">50 </property> <!--jdbc.batch_size是指Hibernate批量插入,删除和更新时每次操作的记录数。Batch Size越大,批量操作的向数据库发送Sql的次数越少,速度就越快,同样耗用内存就越大--> <property name="jdbc.batch_size">23 </property> <!--jdbc.use_scrollable_resultset是否允许Hibernate用JDBC的可滚动的结果集。对分页的结果集。对分页时的设置非常有帮助--> <property name="jdbc.use_scrollable_resultset">false </property> <!--connection.useUnicode连接数据库时是否使用Unicode编码--> <property name="Connection.useUnicode">true </property> <!--connection.characterEncoding连接数据库时数据的传输字符集编码方式,最好设置为gbk,用gb2312有的字符不全--> <property name="connection.characterEncoding">gbk </property> <!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。--> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect </property> <!--指定映射文件为“hibernate/ch1/UserInfo.hbm.xml”--> <mapping resource="org/mxg/UserInfo.hbm.xml"> </session-factory> </hibernate-configuration>
hbm配置文件就是映射实体的,它里面的标签可以映射表之间的关系,具体的什么关系对应什么标签,下一篇博客接着说,这里就不再说了。
hibernate.cfg.xml配置文件作为Hibernate工作的入口,它做的工作都是公共性的。hbm配置文件是具体到数据库表的,每一个hbm.xml文件对应一个数据库表,同时也对应一个实体类,实体类和数据库表的映射就是依靠它来的。hbm.xml文件需要配置到hibernate.cfg.xml文件中,通过mapping标签形容,这样Hibernate在查找的时候,就可以根据类的全路径找到相应的实体。