1、工作原理-ORM
读取并解析hibernate.cfg.xml配置文件
由hibernate.cfg.xml中的<mapping
resource="com/**/*.hbm.xml"/>读取并解析映射信息
创建SessionFactory
打开Sesssion
创建事务Transation
持久化操作
提交事务
关闭Session
关闭SesstionFactory
2、增删改查
session.save(object);
session.delete(object);
session.update(object);
session.createQuery("from
class").list();
3、主键生成方式
identity
用于自动生成主键,除oracle不支持,其他数据库一般都支持
sequence 用序列生成主键,Oracle使用
native
根据配置文件hibernate.cfg.xml中方言来选择生成主键
注意:native的时候加上<param
name="sequence">foo_seq</param>,MySQL不起作用不会报错,Oracle就起作用
increment
不常用
assigned 不常用,手动生成id
4、映射类型
Hibernate映射类型 | Java类型 | 标准SQL类型 | 大 小 | 描述 |
integer | Integer/int | INTEGER | 4字节 | |
double | Double/double | DOUBLE | 8字节 | |
big_decimal | Bigdecimal | NUMERIC | ||
String | java.lang.String | VARCHAR | ||
boolean/yes_no/true_false | Boolean/boolean | BIT | 布尔类型 | |
date | java.util.Date/java.sql.Date | DATE | yyyy-MM-dd | |
time | java.util.Date/java.sql.Time | TIME | hh:mi:ss | |
timestamp | java.util.Date/java.sql.Timestamp | TIMESTAMP | yyyymmddhhmiss |
5、对象三种状态
暂时态
当对象刚创建,未经过session操作,当程序执行完就会立即消失
持久态
对象经过session操作,如执行save,get,query等操作
session会缓存该对象
session再获取对象时,首先去查找一级缓存,如果没有才查询数据库
session负责将持久态对象的变化更新到数据库中
游离态
调用session.evict(Object)方法和session解除关系
6、一级缓存
session级的缓存也叫事务级的缓存,只缓存实体,生命周期和session一致
session负责实时维护缓存中的数据,保证缓存中的数据与数据库中的数据的一致性,一旦用户对缓存的数据进行了修改,session立即将数据更新到数据库中
7、延迟加载
常见延迟加载的方法:load()
iterator()
为了使项目在页面加载完后关闭session,使用ThreadLocal实现OpenSessionInView技术实现页面加载前后调用同一个session,两种方式
a
Hibernateutil中自己管理维护ThreadLocal类(推荐)
1 import org.hibernate.Session;
2 import org.hibernate.SessionFactory;
3 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
4 import org.hibernate.cfg.Configuration;
5
6 public class HibernateUtil {
7 private static ThreadLocal<Session> tl = new ThreadLocal<Session>();
8 private static Configuration conf;
9 private static SessionFactory factory;
10 static {
11 conf = new Configuration().configure();
12 factory = conf.buildSessionFactory(new StandardServiceRegistryBuilder()
13 .applySettings(conf.getProperties()).build());
14 }
15
16 public static Session openSession() {
17 Session session = tl.get();
18 if (session == null) {
19 session = factory.openSession();
20 tl.set(session);
21 }
22 return session;
23 }
24
25 public static void closeSession() {
26 Session session = tl.get();
27 if (session != null) {
28 session.close();
29 tl.set(null);
30 }
31 }
32 }
b 修改hibernate.cfg.xml
在配置文件中加入一句话,告诉 Hibernate 要使用 ThreadLocal
的方式获得 session
<property
name="current_session_context_class">thread</property>
HibernateUtil写法如下
1 import org.hibernate.Session;
2 import org.hibernate.SessionFactory;
3 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
4 import org.hibernate.cfg.Configuration;
5
6 public class HibernateUtil {
7 private static Configuration conf;
8 private static SessionFactory factory;
9 static {
10 conf = new Configuration().configure();
11 factory = conf.buildSessionFactory(new StandardServiceRegistryBuilder()
12 .applySettings(conf.getProperties()).build());
13 }
14
15 public static Session openSession() {
16 return factory.getCurrentSession();
17 }
18
19 public static void closeSession() {
20 Session session = factory.getCurrentSession();
21 if (session != null) {
22 session.close();
23 }
24 }
25 }