一、Hibernate基础
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 }