Hibernate
ORM概念
O:Object 对象
R:Relation 关系 (关系型数据库)外键就是关系
M:Mapping 映射
关系型数据库,对应的有对象型数据库,比较少用。现在主流的是关系型数据库。
MYSQL, Oracle...等都是关系型数据库。
ORM解决什么问题?
存储:能把对象的数据直接保存到数据库
获取:能直接从数据库拿到一个对象
要做到上面2点,必须要有映射。
Hibernate和ORM的关系是什么?
Hibernate实现了 ORM。
ORM相当于是一种思想。
比较好的hibernate博文:
http://blog.csdn.net/jiuqiyuliang/article/details/39078749
图片.png
1.Hibernate 案例
搭建一个Hibernate环境,开发步骤:
1)下载源码:
版本:hibernate-distribution-3.6.0.Final
2)引入jar文件
hibernate3.jar核心 + required 必须引入的(6个)+ jpa + 数据库驱动包
3)写对象以及对象的映射
Employee.java 对象
Employee.hbm.xml 对象的映射
4)src/hibernate.cfg.xml
数据库连接配置
加载所有的映射(*.hbm.xml) // 可以不写.hbm, 为了规范和能够找到hibernate的映射文件,方便些。
Hibernate的schema:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
<hibernate-mapping>一般不去配置,采用默认即可。
default-cascade="none":默认的级联风格,表与表联动。
default-lazy="true":默认延迟加载
-->
<hibernate-mapping>
</hibernate-mapping>
图片.png
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration xmlns="http://www.hibernate.org/xsd/hibernate-configuration">
<session-factory>
<!-- 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 加载映射 -->
<mapping resource="com/ypd/a/entity/Employee.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
注意:
在hibernate.cfg.xml或者是persistence.xml文件下面需要配置javax.persistence.validation.mode属性。
3.写对象以及对象的映射
Employee.java 对象
Employee.hbm.xml 对象的映射(映射文件)
4.src/hibernate.cfg.xml 主配置文件
作用:
1)加载数据库连接
2)加载所有的映射(*.hbm.xml)
4.Hibernate Api
1)Configuration 创建管理类对象
config.configure(); 加载主配置文件的方法。默认加载src/hibernate.cfg.xml
Config.configure("cn/config/hibernate.cfg.xml"); 加载指定位置的指定文件
2)SessionFactory session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)
sf.openSession(); 创建一个session对象
sf.getCurrentSession(); 创建session或获取session对象
3)Session对象
session对象维护了一个连接(Connection),代表了与数据库连接的会话。
Hibernate最重要的对象:只要使用Bibernate与数据库曹组,都用到了这个对象。
session.beginTransaction(); 开启一个事务;hibernate要求所有的与数据库的操作必须有事务的环境,否则报错。
Session.save()obj; 保存一个对象
4)Transaction hibernate 事务对象
@Test
public void testUpdate() throws Exception {
// 对象
Employee emp = new Employee();
emp.setEmpId(1);
emp.setEmpName("邓海3");
emp.setWorkDate(new Date());
// 创建session
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
// 执行操作
session.update(emp); // 执行更新的时候,必须要有组件
ts.commit(); // 这里才是执行
}
更新:
session.save(obj); // 保存一个对象
session.update(emp); // 更新一个对象
主键查询:
session.get(Employee.class, 1); // 主键查询
session.load(Employee.class, 1); // 主键查询 (支持懒加载)
保存或者查询:
session.saveOrUpdate(emp); // 没有设置主键,执行保存;有设置主键,执行更新操作。
5.现在hibernate 一般是要么实体类映射生成数据库表,要么数据库表映射生成实体类。
HQL
hibernate -- HQL语句总结
参考:http://www.cnblogs.com/focusChen/articles/2401892.html
Hibernate的注释
JPA:JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系.
比如你去当当网上买书籍,当当网就给你一个订单。
通过上面的业务活动描述你可以分析得出:一个订单可以包含一个或多个订单项.那么我们将将订单和订单项设计关系为(1:N)一对多的关系(排除0)。得出关系我们就使用JPA来实现这个关系(关于建立JPA和基本的配置我就不再说了,如果不明白请看JPA入门篇)。
@OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE },mappedBy ="order") //这里配置关系,并且确定关系维护端和被维护端。mappBy表示关系被维护端,只有关系端有权去更新外键。这里还有注意OneToMany默认的加载方式是赖加载。当看到设置关系中最后一个单词是Many,那么该加载默认为懒加载
public Set<OrderItem> getItems() {
return items;
}
JPA @MappedSuperclass注释:
基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。
Hibernate五大核心接口
1)Session
2)Transaction
3)Query
4)SessionFactory
5)Configuration
这5个接口构成了hibernate运行的基本要素,可以执行存储,持久化,事务管理等操作。