标签:void 存在 复杂 加载 一个 out containe 状态 直接
文章链接:https://www.cnblogs.com/HelloXHD/p/12892402.html
public void add(){
Session session = Utils.getSession();
Transaction ts = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("李好好");
session.save(customer);
ts.commit();
session.close();
}
public void demo2(){
Session session = Utils.getSession();
Transaction ts = session.beginTransaction();
/**
* get()与load();
*/
//get();执行到get时立即发送sql语句查询
Customer customer = session.get(Customer.class, 7l);
System.out.println(customer);
//load();执行到load时不会马上发送sql语句请求(lazy请求)
Customer customer1 = session.load(Customer.class, 4l);//使用到查询对象时发送请求
System.out.println(customer1);
ts.commit();
session.close();
}
load()和get()都是用来从数据库中加载所需数据来创建一个持久化对象。
- 如果数据库中不存在该对象,load()会抛出一个ObjectNotFoundException异常,而get()只会返回null;
- get()方法首先会查询一级缓存,若不存在则接着查询二级缓存,最后查询数据库(创建对象阶段就加载出所有属性);而load()首先查询一级缓存,若不存在则创建代理对象,在对象真正得到使用时才会开始查询二级缓存和数据库,可实现延迟加载(lazy)功能。
- get()只返回实体类,load()可返回实体类的代理类实例。
- get()方法直接从数据库中检索,而load()方法执行比较复杂:
首先从Session和persistent Context中查询是否存在缓存,若存在则直接返回,否则是否是lazy,如果是则直接检索数据库,,否则需要建立代理对象,在访问获得的代理对象时检索数据库。
public void demo3(){
Session session = Utils.getSession();
Transaction ts = session.beginTransaction();
//直接更改法(不合适)
/*Customer customer = new Customer();
customer.setCust_id(1l);
customer.setCust_name("刘少");
session.update(customer);*/
//先查询后修改(推荐)
Customer customer = session.get(Customer.class, 1l);
customer.setCust_level("123");
customer.setCust_phone("13327362883");
session.update(customer);
ts.commit();
session.close();
}
public void demo4(){
Session session = Utils.getSession();
Transaction ts = session.beginTransaction();
//直接删除法(不合适)
//先查询后删除
Customer customer = session.get(Customer.class, 6l);
session.delete(customer);
ts.commit();
session.close();
}
Query负责各种数据库查询,可以使用Hibernate查询语言(HQL)或者SQL;HQL语言使用类和属性而非表与字段名进行查询;
或者使用Criteria,使用Session实例的createCriteria()方法创建Criteria对象(但此API在Hibernate5中不再推荐使用)
public void demo6(){
Session session = Utils.getSession();
Transaction ts = session.beginTransaction();
//接收HQL:Hibernate Query Language 面向对象查询语言
Query query = session.createQuery("from Customer ");
List<Customer> list = query.list();
for(Customer customer : list){
System.out.println(customer);
}
//QBC:Query By Criteria
//此方法在Hibernate5中不再推荐使用
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list3 = criteria.list();
for (Customer customer : list3){
System.out.println(customer);
}
ts.commit();
session.close();
}
saveOrUpdate()方法包含了save()和update()的功能。
Hibernate会根据对象状态进行选择save()或者update():若对象是持久化对象,则不进行任何操作,直接返回;若对象的标识符属性在数据库中不存在,则调用save();否则,调用update()将对象的值更新到数据库。
ps:如果能够确定对象是否在数据库里就尽量不用saveOrUpdate(),影响效率。
public void demo5(){
Session session = Utils.getSession();
Transaction ts = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_id(8l);
customer.setCust_name("李不好");
session.saveOrUpdate(customer);
ts.commit();
session.close();
}
标签:void 存在 复杂 加载 一个 out containe 状态 直接
原文地址:https://www.cnblogs.com/HelloXHD/p/12989726.html