ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。Hibernate正是实现了这种思想,达到了方便开发人员以面向对象的思想来实现对数据库的操作。
hibernate在实现ORM功能的时候主要用到的文件有:映射类(.Java)、映射文件(.hbm.xml)和数据库配置文件(.properties/.cfg.xml),它们各自的作用如下。
1.映射类(*.java):它是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。
2.映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。
3.数据库配置文件(.properties/.cfg.xml):它是指定与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等。当然还可以把映射类的地址映射信息放在这里。
关联关系分为上述七种,但是由于相互之间有各种关系,可以简化,例如:多对一与一对多映射,只是侧重的角度不对而已。
1.单向一对一关联映射
两个对象之间一对的关系,例如:Person(人)-IdCard(身份证)
有两种策略可以实现一对一的关联映射:
主键关联
即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。如下图:
单向一对一主键关联实例:
http://blog.csdn.net/huangaigang6688/article/details/7761355
外键关联
外键关联,本来是用于多对一的配置,但是加上唯一的限制之后(采用< many-to-one>标签来映射,指定多的一端unique为true,这样就限制了多的一端的多重性为一),也可以用来表示一对一关联关系,其实它就是多对一的特殊情况。如下图:
单向一对一外键关联实例:
http://blog.csdn.net/huangaigang6688/article/details/7761357
注意:
因为一对一的主键关联映射扩展性不好,当我们的需要发生改变想要将其变为一对多的时候变无法操作了,所以我们遇到一对一关联的时候经常会采用唯一外键关联来解决问题,而很少使用一对一主键关联。
2.双向一对一关系映射
基于外键
介绍
对于基于外键的1-1关联,外键可以存放在任意一边。需要存放外键的一端,需要增加
实例
实体类
public class Department {
private Integer deptId;
private String deptName;
private Manager manager;
//省去get和set
}
public class Manager {
private Integer mgrId;
private String mgrName;
private Department department;
//省去get和set
}
Manager.hbm.xml
<hibernate-mapping package="com.lihui.hibernate.double_1_1.foreign">
<class name="Manager" table="MANAGERS">
<id name="mgrId" type="java.lang.Integer">
<column name="MGR_ID" />
<generator class="native" />
</id>
<property name="mgrName" type="java.lang.String">
<column name="MGR_NAME" />
</property>
<!-- 映射1-1的关联关系,在对应的数据表中已经有外键,当前持久花类使用ont-to-one进行映射 -->
<one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
</class>
</hibernate-mapping>
Department.hbm.xml
<hibernate-mapping package="com.lihui.hibernate.double_1_1.foreign">
<class name="Department" table="DEPARTMENTS">
<id name="deptId" type="java.lang.Integer">
<column name="DEPT_ID" />
<generator class="native" />
</id>
<property name="deptName" type="java.lang.String">
<column name="DEPT_NAME" />
</property>
<many-to-one name="manager" class="Manager" column="MGR_ID" unique="true"></many-to-one>
</class>
</hibernate-mapping>
测试
public void testGet(){
Department dep = (Department) session.get(Department.class, 1);
System.out.println(dep.getDeptName());
Manager mgr =dep.getManager();
System.out.println(mgr.getMgrName());
}
@Test
public void testSave() {
Department dep = new Department();
dep.setDeptName("a");
Manager mgr = new Manager();
mgr.setMgrName("b");
dep.setManager(mgr);
mgr.setDepartment(dep);
session.save(mgr);
session.save(dep);
}
Notice
上面的映射策略可以互换,即让Manager存放外键,使用
基于主键
介绍
如果采用基于主键的映射策略,则一端的主键生成器需要使用foreign策略,表明将根据对方的主键来生成自己的主键,本实体不能拥有自己的主键声称策略。子元素指定使用当前持久化类的哪个属性作为“对方”。
<generator class="foreign" >
<param name="property">manager</param>
</generator>
当然,任意一端都可以采用foreign主键生成器策略,表明将根据对方主键来生成自己的主键。
采用foreign主键生成器策略的一端增加one-to-one元素映射相关属性,其ont-to-one属性还应增加constrained=true属性;另一端增加one-to-one元素映射关联属性。
constrained:指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联对象所对应的数据库主键。
实例
实体类与上文中的实体类相同。
Manager.hbm.xml
<hibernate-mapping package="com.lihui.hibernate.double_1_1.primary">
<class name="Manager" table="MANAGERS">
<id name="mgrId" type="java.lang.Integer">
<column name="MGR_ID" />
<generator class="native" />
</id>
<property name="mgrName" type="java.lang.String">
<column name="MGR_NAME" />
</property>
<one-to-one name="department" class="Department"></one-to-one>
</class>
</hibernate-mapping>
Department.hbm.xml
<hibernate-mapping package="com.lihui.hibernate.double_1_1.primary">
<class name="Department" table="DEPARTMENTS">
<id name="deptId" type="java.lang.Integer">
<column name="DEPT_ID" />
<generator class="foreign" >
<param name="property">manager</param>
</generator>
</id>
<property name="deptName" type="java.lang.String">
<column name="DEPT_NAME" />
</property>
<one-to-one name="manager" class="Manager" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
参考:
https://www.w3cschool.cn/hibernate_articles/l7kc1iok.html
http://blog.csdn.net/huangaigang6688/article/details/7761310