Many to One:
User.hbm.xml:
<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>
Group.hbm.xml:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
One to One:
- 方式一:主键关联——让两个对象具有相同的主键值,以表明它们之间的一对一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
【单向】
- 图:
代码:
IdCard.hbm.xml:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> </hibernate-mapping>
Person.hbm.xml:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Person" table="t_person"> <id name="id"> <!-- 采用foreign生成策略,forgeign会取得关联对象的标识 --> <generator class="foreign"> <!-- property只关联对象 --> <param name="property">idCard</param> </generator> </id> <property name="name"/> <!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载 也就是拿到关系字段值,根据对端的主键来加载关联对象 constrained="true表示,当前主键(person的主键)还是一个外键 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句 --> <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping>
【双向】
- 图:
- 核心代码:
Person.hbm.xml:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Person" table="t_person"> <id name="id"> <!-- 采用foreign生成策略,forgeign会取得关联对象的标识 --> <generator class="foreign"> <!-- property只关联对象 --> <param name="property">idCard</param> </generator> </id> <property name="name"/> <!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载 也就是拿到关系字段值,根据对端的主键来加载关联对象 constrained="true表示,当前主键(person的主键)还是一个外键 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句 --> <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping>
IdCard.hbm.xml:
<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>
- 方式二:唯一外键关联——外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系。
【单向】
- 图:
- 核心代码代码:
IdCard.hbm.xml:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> </hibernate-mapping>
Person.hbm.xml:
<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>
【双向】
- 图:
- 核心代码:
IdCard.hbm.xml:
<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" property-ref="idCard"/> </class> </hibernate-mapping>
Person.hbm.xml:
<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>
Many to Many:
【单向】
- 图:
Role.hbm.xml:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
User.hbm.xml:
<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>
【双向】
User.hbm.xml:
<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" not-null="true"/> <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> </set> </class> </hibernate-mapping>
Role.hbm.xml:
<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,没有深入的学习过,这一边算是从理论上有全面的认识了一次,学习相对还是比较容易(因为之前基础过)。任何一个框架都不是用来解决所有问题的,它只是擅长某一方面而已。Hibernate也是一样的,它给我们带了这样的优势:
——提高生产力
——是开发更加面向对象化
——可移植性
——没有侵入性,支持透明持久化
同时也有一些缺点存在:
——使用数据库特性的语句,很难调优(同时也有它的好吃,对于开发人员来说,比较容易上手)
——对大批量数据更新存在问题
——系统中存在大量的统计查询功能