Hibernate数据映射关系
2016-11-21 17:20
351 查看
对象关系映射(Object Relational Mapping)是将关系数据库中表的数据映射成对象,方便开发人员以面向对象思想操作数据库的技术。Hibernate是Java领域内的一款开源的ORM框架技术,与Spring,Struts组成大名鼎鼎的SSH,在JavaEE中占有重要地位。
(从本质上而言,最终Hibernate还是通过JDBC来进行对数据库的操作,只不过在JDBC的基础上进行了一定的封装)
2,与EBJ(本身是JavaEE的规范,重量级的ORM框架技术)不同,Hibernate属于轻量级的ORM框架技术。
3,Hibernate介于数据库层和业务逻辑层之间,起到持久化层的作用。
4. Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在于内存中,当程序真正对数据的操作时,对象才存在于内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
5. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
单向:一对一,多对一,一对多,多对多
双向:一对一,多对一(一对多),多对多
主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
唯一外键关联:外键关联,本来是用于多对一的配置,但是加上唯一的限制之后(采用标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性为一),也可以用来表示一对一关联关系,其实它就是多对一的特殊情况。
IdCard.hbm.xml映射文件:
User.hbm.xml映射文件:
User.hbm.xml
Group.hbm.xml
Goods.hbm.xml
TransHistory.hbm.xml
一对多与多对一的区别是维护的关系不同
和前面的员工分组略有区别,变成了多对多的关系
多对多需要一张额外的数据表来关联两组数据的主键,关联表要取合适的表名来说明是关联表,例如“id_表一表二”,或者“表一表二_xref”
依然使用上面的类
User.hbm.xml
Group.hbm.xml
IdCard.hbm.xml映射文件:
User.hbm.xml映射文件:
可能有错误,欢迎批评指正,之后会继续深入学习
Hibernate的机制原理:
1,Hibernate对JDBC进行非常轻量级的封装。(从本质上而言,最终Hibernate还是通过JDBC来进行对数据库的操作,只不过在JDBC的基础上进行了一定的封装)
2,与EBJ(本身是JavaEE的规范,重量级的ORM框架技术)不同,Hibernate属于轻量级的ORM框架技术。
3,Hibernate介于数据库层和业务逻辑层之间,起到持久化层的作用。
4. Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在于内存中,当程序真正对数据的操作时,对象才存在于内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
5. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
Hibernate数据映射关系
Hibernate中,按照数据的管理方式分为单向和双向,单向就是一方控制另一方,双向就是互相都可以控制。根据数据的实际联系又可以分为一对一,一对多,多对一和多对多。,因为双向的一对多和多对一是一样的,所以最终有7种映射关系。单向:一对一,多对一,一对多,多对多
双向:一对一,多对一(一对多),多对多
单向一对一映射:
有两种策略可以实现一对一的关联映射:主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
唯一外键关联:外键关联,本来是用于多对一的配置,但是加上唯一的限制之后(采用标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性为一),也可以用来表示一对一关联关系,其实它就是多对一的特殊情况。
public class IdCard { private int id; private String cardNo; /**setters & getters**/ }
public class User { private int id; private String name; private IdCard idCard; /**setters & getters**/ }
IdCard.hbm.xml映射文件:
<hibernate-mapping> <class name="com.hibernate.IdCard" table="t_idCard"> <id name="id"> <column name="id"/> <generator class="native"></generator> </id> <property name="cardNo" type="jave.long.String"> <column name="card_no"/> </property> </class> </hibernate-mapping>
User.hbm.xml映射文件:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.User" table="t_user"> <id name="id"> <column name="id"/> <generator class="native"> <!-- property只关联对象 --> <param name="property">idCard</param> </generator> </id> <property name="name" type="java.long.String"> <column name="name"/> </property> <!--唯一外键关联--> <many-to-one name="idCard" class="com.hibernate.IdCard" column="id_card" unique="true"/> <!--主键关联--> <one-to-one name="idCard" class="com.hibernate.IdCard" constrained="true"/> </class> </hibernate-mapping>
单向多对一映射
一个例子是员工分组,把所有的员工分到不同的部门public User{ private Integer id; private String name; private Integer idGroup; }
publiv Group{ private Integer id; private String name; }
User.hbm.xml
<hibernate-mapping> <class name="com.hibernate.User" table="t_user"> <id name="id" type="java.long.Integer"> <column name="id"/> <generator class="native"></generator> </id> <property name="name" type="java.long.String"> <column name="name"/> </property> <many-to-one name="idGroup" column="id_group" class="com.hibernate.Group"/> </class> </hibernate-mapping>
Group.hbm.xml
<hibernate-mapping> <class name="com.hibernate.Group" table="t_group"> <id name="id" type="java.long.Integer"> <column name="id"/> <generator class="native"></generator> </id> <property name="name" type="java.long.String"> <column name="name"/> </property> </class> </hibernate-mapping>
单向一对多映射:
public class Goods{ private Integer id; private String name; private Set<TransHistory> transHistory = new HashSet<TransHistory>(); }
public class TransHistory{ private Integer id; private Integer sum; private Double price; private Integer idGoods; }
Goods.hbm.xml
<hibernate-mapping> <class name="com.hibernate.Goods" table="t_goods"> <id name="id" type="java.long.Integer" > <column name="id"/> <generator class="native"> </generator> </id> <property name="name" type="java.long.String"> <column name="name"/> </property> <set name="transHistory"> <key column="id_goods"/> <one-to-many class="com.hibernate.TransHistory"/> </set> </class> </hibernate-mapping>
TransHistory.hbm.xml
<hibernate-mapping> <class name="com.hibernate.TransHistory" table="t_trans_history"> <id name="id" type="java.long.Integer" > <column name="id"/> <generator class="native"> </generator> </id> <property name="sum" type="java.long.Integer"> <column name="sum"/> </property> <property name="price" type="java.long.Double"> <column name="price"/> </property> </class> </hibernate-mapping>
一对多与多对一的区别是维护的关系不同
*多对一维护的关系是:多指向一的关系,有了此关系,加载多的时候可以将一加载上来 *一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来
单向多对多映射:
较好的例子是员工任务分配,每个员工可能要负责多个任务,负责每项任务都需要多名员工共同完成和前面的员工分组略有区别,变成了多对多的关系
多对多需要一张额外的数据表来关联两组数据的主键,关联表要取合适的表名来说明是关联表,例如“id_表一表二”,或者“表一表二_xref”
依然使用上面的类
public User{ private Integer id; private String name; //不在使用单一ID作为对应 //private Integer groupId; //转使用set进行多对多映射 private Set<Group> group=new HashSet<Group>(); } publiv Group{ private Integer id; private String name; private Set<User> user=new HashSet<User>(); }
User.hbm.xml
<hibernate-mapping> <class name="com.hibernate.User" table="t_user"> <id name="id" type="java.long.Integer"> <column name="id"/> <generator class="native"></generator> </id> <property name="name" type="java.long.String"> <column name="name"/> </property> <set name="group" table="t_user_group"> <key column="id_user"/> <many-to-many class="com.hibernate.Group" column="id_group"/> </set> </class> </hibernate-mapping>
Group.hbm.xml
<hibernate-mapping> <class name="com.hibernate.Group" table="t_group"> <id name="id" type="java.long.Integer"> <column name="id"/> <generator class="native"></generator> </id> <property name="name" type="java.long.String"> <column name="name"/> </property> <set name="user" table="t_user_group"> <key column="id_group"/> <many-to-many class="com.hibernate.User" column="id_user"/> </set> </class> </hibernate-mapping>
双向一对一关联映射:
就是将两个关联类都加上标签:public class IdCard { private int id; private String cardNo; /**setters & getters**/ }
public class User { private int id; private String name; private IdCard idCard; /**setters & getters**/ }
IdCard.hbm.xml映射文件:
<hibernate-mapping> <class name="com.hibernate.IdCard" table="t_idCard"> <id name="id"> <column name="id"/> <generator class="native"></generator> </id> <property name="cardNo" type="jave.long.String"> <column name="card_no"/> </property> <one-to-one name="idCard"/> </class> </hibernate-mapping>
User.hbm.xml映射文件:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.User" table="t_user"> <id name="id"> <column name="id"/> <generator class="native"> <!-- property只关联对象 --> <param name="property">idCard</param> </generator> </id> <property name="name" type="java.long.String"> <column name="name"/> </property> <!--主键关联--> <one-to-one name="idCard" class="com.hibernate.IdCard"> <!--唯一外键关联--> <one-to-one name="idCard" class="com.hibernate.IdCard" property-ref="idCard"/> </class> </hibernate-mapping>
双向的一对多映射
就是将单向的一对多和多对一结合起来即可双向的多对多映射
同理也是在两个配置文件中写两个<set><many-to-many ......></set>即可
可能有错误,欢迎批评指正,之后会继续深入学习
相关文章推荐
- Hibernate数据类型映射关系
- Hibernate学习之 -- 使用Middlegen-Hibernate-r5创建oracle10g的table的hibernate映射文件,Hibernate学习笔记三 ---持久化类和关系数据
- Hibernate关联映射-数据对象三种关系
- hibernate数据类型之间的映射关系
- Hibernate 继承关系映射——每个类一个数据表
- Hibernate如何实现数据表映射的继承关系
- MySQL\Hibernate\Java数据类型映射关系
- 数据表/字段名称和数据库关键字冲突在Hibernate映射中的处理办法
- 终结守卫者模式在HashMap关系数据映射技术软件PVO中的应用
- Hibernate继承映射--每个子类一个数据表的实现案例
- hibernate3 关系映射 使用说明
- 在Hibernate中实现复杂的数据映射
- 较为复杂的 Hibernate 数据映射
- XML和关系数据----从XSD架构创建数据集映射
- HashMap关系数据映射技术(简称PVO技术)
- 在Hibernate中实现复杂的数据映射
- 在Hibernate中实现复杂的数据映射
- Extraction应用构建平台应用基础(八)------数据类型和Java对象的映射关系篇
- 在Hibernate中实现复杂的数据映射
- 关于hibernate映射继承关系时独立的子类配置文件的问题