Hibernate基础知识总结
整体结构
一、Hibernate相关的API
- configuration ,到src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件);
- sessionFactory ,使用configuration对象创建sessionFactory对象;
- (1)创建sessionfactory过程中做事情:
- 根据核心配置文件中,有数据库配置,有映射文件部分,到数据库里面根据映射关系把表创建;
- (2)创建sessionFactory过程中,这个过程特别耗资源的:
- 在hibernate操作中,建议一个项目一般创建一个sessionFactory对象;
- (3)具体实现:
- 写工具类,写静态代码块实现,静态代码块在类加载时候执行,执行一次;
- session ,类似于jdbc中connection;
- (1)调用session里面不同的方法实现crud操作:
- 添加 save方法;
- 修改 update方法;
- 删除 delete方法;
- 根据id查询 get方法;
- Load方法,根据ID查,(返回的是代理,不会立即访问数据库);
- saveOrUpdate,merge(根据ID和version的值来确定是save或update),调用merge你的对象还是托管的;
- lock(把对象变成持久对象,但不会同步对象的状态);
- (2)调用session里面不同的方法实现crud操作:
- session对象单线程对象
- Transaction 事务;
- (1)事务提交和回滚方法
- 事务开启:Transaction tx = session.beginTransaction();
事务提交:tx.commit();
事务回滚:tx.rollback();
- 事务开启:Transaction tx = session.beginTransaction();
- (2)事务概念
- 事务四个特性
- 原子性(事务不可再被分割);
- 一致性(数据操作前后是一致的);
- 隔离性(多个事务同时调用一条记录时互不干扰);
- 持久性(提交到数据库才算持久对象) ;
- 事务四个特性
- Query,Qyuery主要用于Hibernate执行hql语句。
-
hql语句:hibernate提供的面向对象的查询语句,使用对象(类)和属性进行查询,区分大小写。
-
获得Query对象:Query query = session.createQuery(“hql”)
- Criteria实际上是个条件附加的容器,如果想要设定查询条件,则要使用org.hibernate.criterion.Restrictions的各种静态方法传回org.hibernate.criterion.Criteria实例,传回的每个org.hibernate.criterion.Criteria实例代表着一个条件:
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.gt("age", new Integer(20)));
criteria.add(Restrictions.lt("age", new Integer(40)));
List users = criteria.list();
二、集合属性
- Set
- HashSet 无序,不重复
- List
- 有序,可重复,使用List时,配置文件中可以使用Bag标签
- Map
- 键值对
- HashMap 无序,不重复(以key为准)
- 注意:
- 使用集合属性时,一定要使用接口,而不能声明为具体的实现类。
因为经过Session操作后,集合就变成了Hibernate自己的集合实现类。 - 值类型的集合,集合元素是普通类型
- 实体类型的集合,集合元素是另一个实体
- 使用集合属性时,一定要使用接口,而不能声明为具体的实现类。
三、关联关系
- 单向多对一
public class Person{
private int pid;
private String name;
private Address address;
...//生成相应的getter、setter方法
}
public class Address{
private int id;
private String detail;
...//生成相应的getter、setter方法
}
这里我们需要维护的关系是多个Person可以对应同一个地址,使用单向的多对一,映射我们只需要在多的一端加入一个外键指向一的一端即可
<class name="Person">
<id name="id">
<generator class="native"/>
</id>
...//部分字段配置省略
<many-to-one name="address" column="addressId"/>//关键配置
</class>
这样配置以后hibernate就会帮我们在多的一端(Person)添加一个外键addressId指向一的一端;
2. 单向多对一单向一对多
看代码,我们知道一个班级有多名学生,这就是一个典型的一对多关系
public class Classes {
private int id;
private String name;
private Set students;
...//生成相应的getter、setter方法
}
public class Student {
private int id;
private String name;
..//生成相应是getter、setter方法
}
映射原理:一对多关联映射,在多的一端添加一个外键指向一的一端,它维护的关系是一指向多
<class name="Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name