Hibernate是一个轻量级的数据持久化框架,在使用时我们需要进行一些相关配置,如hibernate.cfg.xml和*.hbm.xml。前者包含了Hibernate与数据库的基本连接信息;后者包含了Hibernate的基本映射信息,即系统中每一个类与其对应的数据库表之间的关联信息。在Hibernate工作的初始阶段,这两个文件的信息被加载到Configuration和SessionFactory实例。
一、Hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
XML解析器使用DTD文档来检查XML文件的合法性。
正文以<hibernate-configuration>元素开始,其中又包含了其他的子元素,如<property>,
<session-factory>,<listener>,<mapping>,<security>等。我们经常会用到<session-factory>,它的基本配置如下:
<session-factory>
<!--数据库驱动信息-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--数据库url-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<!--用户名-->
<property name="hibernate.connection.username">root</property>
<!--密码-->
<property name="hibernate.connection.password">12345678</property>
<!--数据库方言信息-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--指定hibernate映射文件路径-->
<mapping resource="test/User.hbm.xml"/>
</session-factory>
二、*.hbm.xml
该文档通过一系列XML元素的配置,来将持久化类与数据库表之间建立起一一映射。这意味着映射文档是按照持久化类的定义来创建的,而不是表的定义。
基本格式如:
<?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">
<hibernate-mapping>
<class name="类名" table=”表名”>
<id name="主键在java类中的名" column=”对应表中字段” type=”类型”>
<generator class="主键生成策略"/>
</id>
<!--普通属性-->
<property name="name"/>
</class>
</hibernate-mapping>
Property中比较常用的属性有:name(对应的java类的属性名称)、column(对应的表中的字段)、type(属性的类型,eg.java.lang.String)、not-null(设置该属性是否为空,为true时表示非空,默认为false)和length(字段的长度限制)。 示例如下:
<property name="accessname" column="accessName" type="java.lang.String" not-null="true" />
Hibernate存在多种关联关系
⒈一对多关系(<many-to-one…/>和<set…></set>)
一对多关系一般是用在一个表与另一个表存在外键关联的时候,例如用户表的组织id与组织表存在外键关联,则“一”方为组织表,“多”方为用户表,因为一个组织可以包含多个用户,而一个用户只能隶属于一个组织。
对于存在一对多关系和多对一关系的双方,需要在…hbm.xml中进行相应配置,这时在“一”方(例如:组织)需要在映射文件中添加<set…></set>元素,因为它包含多个“多”方的对象,一般的格式如下:
<set name="java映射类中对应的属性" inverse="true" lazy="true">
<key column="表中对应字段"/>
<one-to-many class="多方的类"/>
</set>
“多”方(例如:用户)隶属于一个“一”方对象,一般的格式如下:
<many-to-one name="java映射类中对应的属性" column="表中对应字段" class="类名" not-null="true" />
⒉ 一对一关系(<one-to-one…/>)
一对一关系相对一对多关系来说比较少见,但也在某些情况下要用到,例如有一个用户的基本信息表(USER)和一个用户的密码表(PASSWD)就存在一对一的关系。下面来看一下一对一关系在Hibernate的配置。
<!-- 其中主表(eg. 用户的基本信息表)的配置 -->
<one-to-one name="主表对象中子表对象的属性名" class="子表对象的类名" cascade="save-update"/>
<!-- 子表(eg. 用户的密码表)的配置 -->
<one-to-one name="子表对象中主表对象的属性名" class="主表对象的类名" constrained="true" />
⒊ 多对多关系(<many-to-many…/>)
在数据库设计时,一般将多对多关系转换为两个一对多(或多对一)关系,例如在基于角色的权限系统中,用户和角色存在的关系就是典型的多对多关系,即一个用户可以具有多个角色,而一个角色又可以为多个用户所有,一般在设计时,都会加一个用户与角色的关联表,该表与用户表以及角色表都存在外键关联。
设置格式如下:
<set name="java对象的属性名" table="表名" cascade="all" outer-join="false">
<key column="表的对应字段"/>
<many-to-many class="另一个表的对象类" column="另一个表的字段"/>
</set>