Hibernate.cfg.xml配置文件,是hibernate的主要配置文件,里面包含了,数据库连接信息配置,数据库方言配置,sql语句打印配置,sql语句格式化配置,数据库更新方式配置,加载实体类配置文件等等,
hibernate的另一个很重要的配置文件就是实体类对应的配置文件*.hbm.xml配置文件,里面配置了实体类和数据库表对应的信息,包含实体类的类名、主键生成方式、属性、类型以及数据库的表名、列名、主键自增方式等等......
下面我把几个常用的配置,以及注解展示出来,方便大家查看:
写了一个cfg的项目,名称是hibernate_cfg
架构如下:
hibernate.cfg中的pojo和test包下的代码,可以参见《Hibernate环境搭建和配置》
其中hibernate.cfg.xml配置文件中,常见的配置如下:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置数据库连接信息 -->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">jdbc:mysql:///hibernate4</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 数据库方言 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</property>
<!-- 是否打印sql语句 -->
<property name="show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="format_sql">true</property>
<!-- 数据库更新方式:
1、create:每次更新都先把原有数据库表删除,然后创建该表;
2、create-drop:使用create-drop时,在显示关闭SessionFacroty时(sessionFactory.close()),将drop掉数据库Schema(表)
3、validate:检测;
4、update(常用):如果表不存在则创建,如果存在就不创建
-->
<property name="hbm2ddl.auto">update</property>
<!-- 加载User实体类对应的配置文件 -->
<mapping resource="com/robert/pojo/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
实体类User代码如下:
package com.robert.pojo;
public class User {
private int id ;
private String name ;
private String pwd ;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
和实体类User对应的User.hbm.xml配置文件的内容和详解如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- This mapping demonstrates content-based discrimination for the table-per-hierarchy
mapping strategy, using a formula discriminator. -->
<!-- package:声明pojo类所在的包,如果不写,那么在class中的name里需要指明pojo类所在的包;
schema:指数据库的模式,一个模式下可以有多张表。
-->
<hibernate-mapping package="com.robert.pojo">
<!-- class:指映射一个pojo类,
1)提供了公共的无参构造方法,通过反射产生对象。
2)属性用private修饰,并且生成对应的set/get方法。
3)类不能用final来修饰,hibernate会产生代理类(通过cglib)。
name:表示pojo类名;
table:表示pojo类对应的数据库中的表名;如果不写,默认是类名。
-->
<class name="User" table="user">
<!--
id:表示实体类的标识(OID),对应数据库表的主键;
name:指实体类的标识属性名;
column:表示对应数据库表的列名,如果不写,则和属性名一致;
length:表示数据库表中对应数据类型的长度,如果不写,有默认长度;
type:表示类型,如果不写,hibernate会找对应pojo类的属性类型;
-->
<id name="id" column="id">
<!-- 主键生成策略
increment:用于为long,short或者int类型生成唯一标识,
只有在没有其他进程往同一张表中插入数据时才能使用。在集群下不要使用。
(可以使用的数据库是:mysql,ms sql)。
identity:对DB2,MySQL,MS SQL Server,Sybase和HypersonicSQL的内置标识字段提供,
返回的标识符是long, short, 或者int类型的。
sequence:在支持序列的数据库中使用,使用数据库是oracle。
例子:
<generator class="sequence" >
注释:param中的值是数据库sequence的名称
<param name="sequence">user_seq</param>
</generator>
uuid: UUID被编码为一个32位的16进制数字的字符串;
native:根据底层的数据库能力选择,identity,sequence或者hilo中的一个;
assigned:自己指定主键。
-->
<generator class="native" />
</id>
<!--
实体类的属性
name:指明pojo类属性名称(区分大小写);
column:实体类属性对应的数据库表列名;
-->
<property name="name" >
<column name="name"></column>
</property>
<property name="pwd" />
</class>
</hibernate-mapping>