final
进行修饰:延迟就在本身是Hibernate一个优化手段。返回的是一个代理对象,可以对没有实现接口的类产生代理,这种代理使用了非常底层的字节码增强技术,继承这个类进行代理。如果不能被继承,不能产生代理对象,延迟就在也就失效了。load
和get
方法就一致了select max(id) from 表;
,然后让id +1
作为下一条的记录的主键@Test
//三种状态的区分
public void demo1() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer = new Customer(); // 瞬时态对象:没有唯一标识OID,没有被session管理
customer.setCust_name("王晓东");
Serializable id = session.save(customer); // 持久态对象:有唯一标识OID,被session管理
tx.commit();
session.close();
System.out.println("客户名称: " + customer.getCust_name()); // 托管态对象:有唯一标识OID,没有被session管理
}
Customer customer = new Customer();
save(Obejct obj)、saveOrUpdate(Object obj);
customer.setCust_id(1);
get()、load()、find()、iterate()
Customer customer = session.get(Customer.class,1L);
delete()
close()、clear()、evict(Object obj)
Customer customer = new Customer();
customer.setCust_id(1L);
update()、 saveOrUpdate()
customer.setCust_id(null)
@Test // 持久态对象自动更新数据库
public void demo2() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
// 获得持久态对象:
Customer customer = session.get(Customer.class, 1L);
customer.setCust_name("王喇嘛");
//session.update(customer);
// 不写这句话也可以将数据保存到数据库,这是持久态对象的特征,底层是一级缓存
transaction.commit();
session.close();
}
package com.itzhouq.hibernate.demo1;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.itzhouq.hibernate.utils.HibernateUtils;
public class Demo3 {
// 证明一级缓存的存在
@Test
public void test() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
// Customer customer1 = session.get(Customer.class, 1L); // 发送SQL语句
// System.out.println(customer1);
//
// Customer customer2 = session.get(Customer.class, 1L); // 不发送SQL语句
// System.out.println(customer2);
Customer customer = new Customer();
customer.setCust_name("凤姐");
Serializable id = session.save(customer);
Customer customer2 = session.get(Customer.class, id); // 不发送SQL语句
System.out.println(customer2);
transaction.commit();
session.close();
}
}
Read uncommitted
:以上读问题都会发生Read committed
:解决脏读,但是不可重复读和虚读有可能发生(Oracle)Repeatable read
:解决脏读和不可重复读,但是虚读有可能发生(Mysql)Serlializable
:解决所有读问题在主配置文件中添加以下配置
<property name="hibernate.connection.isolation">4property>
4为MySQL数据库的默认级别
数字和隔离级别的对应关系
Read uncommitted isolation
Read committed isolation
Repeatable read isolation
Serializable isolation
Service层的事务
代码和配置
改写工具类,添加getCurrentSession
()订单
package com.itzhouq.hibernate.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/*
* Hibernate的工具类
*/
public class HibernateUtils {
public static final Configuration cfg;
public static final SessionFactory sf;
static {
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
public static Session openSession() {
return sf.openSession();
}
public static Session getCurrentSession() {
return sf.getCurrentSession();
}
}
在主配置文件中配置当前线程绑定的Session
<property name="hibernate.current_session_context_class">threadproperty>
测试
package com.itzhouq.hibernate.demo1;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.itzhouq.hibernate.utils.HibernateUtils;
/*
* 测试当前线程绑定的Session
*/
public class Demo4 {
@Test
public void test() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("王希");
session.save(customer);
transaction.commit();
//session.close();//不需要关闭
}
}
注意:绑定线程的session不需要手动关闭。因为当前线程自动获得与当前线程绑定的Session,线程结束之后,自动关闭Sesson,不需要手动关闭。
Query接口使用接收HQL,查询多个对象
Hibernate Query Language
:HIbernate查询语言,这种语言与SQL的语法及其类似,面向对象的查询语言。package com.itzhouq.hibernate.demo1;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.itzhouq.hibernate.utils.HibernateUtils;
/*
* HIbernate的其他API
*/
public class Demo5 {
@Test // Query
public void test() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 通过Session获得Query接口
//简单查询
//String hql = "from Customer";
//条件查询
//String hql = "from Customer wehre cust_name like ?";
//分页查询
String hql = "from Customer";
Query query = session.createQuery(hql);
//设置条件
//query.setParameter(0, "王%");
//设置分页
query.setFirstResult(0);
query.setMaxResults(3);
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
}
条件查询:Query By Criteria
代码
@Test // Criteria
public void test2() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
//通过Session获得Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
//List list = criteria.list();
//条件查询
// Criteria add = criteria.add(Restrictions.like("cust_name", "王%"));
// List list = criteria.list();
//分页查询
criteria.setFirstResult(0);
criteria.setMaxResults(2);
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}