ORM的实现思想就是将关系数据库中表的数据映射成对象。以对象的形式展现,这样开发者就能够把对数据库的操作转化为对这些对象的操作。Hibernate正是实现了这样的思想,达到了方便开发者以面向对象的思想来实现对数据库的操作。
Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java)、映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg.xml)。它们各自的作用例如以下。
映射类(*.java):它是描写叙述数据库表的结构,表中的字段在类中被描写叙述成属性,将来就能够实现把表中的记录映射成为该类的对象了。
映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系。包含映射类和数据库表的相应关系、表字段和类属性类型的相应关系以及表字段和类属性名称的相应关系等。
数据库配置文件(*.properties/*.cfg.xml):它是指定与数据库连接时须要的连接信息。比方连接哪种数据库、登录数据库的username、登录password以及连接字符串等,另一个重要的内容就是实体映射文件。
hibernate.cfg.xml
<hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:8082/hibernate_first</property> <property name="hibernate.connection.username">admin123</property> <property name="hibernate.connection.password">admin123</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.show_sql">true</property> <mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/> </session-factory> </hibernate-configuration>
因为数据库表中的关系要通过实体关系表现出来,因此,便出现了Hibernate的映射关系。通过这样的映射关系。来表现相应数据库表之间的关系!
映射关系:
一、单向映射:
1、一对一关联:
两个对象之间一对的关系。比如:Person(人)-IdCard(身份证)。这样的映射有两种策略:
*主键关联:通过两个实体的主键进行关联。
映射实现:在一端加入<one-to-one />
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Person" table="t_person"> <id name="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name"/> <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping>
*唯一外键关联:外键关联,本来是用于多对一的配置,可是加上唯一的限制之后(採用<many-to-one>标签来映射。指定多的一端unique为true,这样就限制了多的一端的多重性为一)。也能够用来表示一对一关联关系,事实上它就是多对一的特殊情况。
映射实现:在单向一端加入<many-to-one />
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Person" table="t_person"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="idCard" unique="true"/> </class> </hibernate-mapping>
2、多对一关联:
映射实现:在多的一端加入<many-to-one />
<hibernate-mapping> <class name="com.bjpowernode.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="group" column="groupid" cascade="save-update"/> </class> </hibernate-mapping>
3、一对多关联:
一对多关联映射和多对一关联映射原理是一致的。都是在多的一端增加一个外键,指向一的一端
映射实现:在一的一端加入<one-to-many />
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students"> <key column="classesid"/> <one-to-many class="com.bjpowernode.hibernate.Student"/> </set> </class> </hibernate-mapping>
4、多对多关联:
多对多关联映射新添加一张表才完毕基本映射,例如以下图
映射实现:在单向多的一端加入<many-to-many />标签
<hibernate-mapping> <class name="com.bjpowernode.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="user_id"/> <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> </set> </class> </hibernate-mapping>
二、双向映射:
1、一对一关联映射
映射实现:在两端加入<one-to-one/>标签
<hibernate-mapping> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <one-to-one name="person"/> </class> </hibernate-mapping>
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Person" table="t_person"> <id name="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name"/> <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping>
2、一对多关联映射
映射实现:多的一端加入<many-to-one/>标签,一的一端加入<one-to-many/>标签
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students" inverse="true"> <key column="classesid"/> <one-to-many class="com.bjpowernode.hibernate.Student"/> </set> </class> </hibernate-mapping>
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Student" table="t_student"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="classes" column="classesid"/> </class> </hibernate-mapping>
3、多对多关联映射:
映射实现:两端都加入<many-to-many/>标签
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="users" table="t_user_role"> <key column="role_id" not-null="true"/> <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/> </set> </class> </hibernate-mapping>
<hibernate-mapping> <class name="com.bjpowernode.hibernate.User" table="t_user"> <id name="id"> <span style="white-space:pre"> </span><generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="user_id" not-null="true"/> <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> </set> </class> </hibernate-mapping>
二、小结:
通过Hiberante的映射关系。从而实现了数据库表中的相对复杂的表关系。
PS:Hibernate的这几种映射关系和EJB的映射关系。大同小异。