Hibernate中Session对象方法详解:
首先是测试类:
public class HibernateTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init() {
sessionFactory = null;
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
@After
public void distroy() {
transaction.commit();
session.close();
sessionFactory.close();
}
}
下面是Session对象方法的详细说明 :
flush()
@Test
public void test8(){
/** * session.flush() : * 当session缓存中的数据发生更改时, * 并且session缓存中的数据与数据库中的数据不一致时, * 更改数据库的数据 * 注意事项 : * flush()会发送SQL语句更改数据库,但并不会提交事务, * 数据库数据不会发生改变 * 调用时机 : * 进行数据库查询时,会先调用flush(),以得到最新记录 * 如果ID是自增的,调用save()时, * 会调用flush()立即发送SQL语句,以保证ID是存在的 */
Customer customer = (Customer) session.load(Customer.class,1);
//此时customer.customerName为"数据库更新之前"
System.out.println(customer);
customer.setCustomerName("数据库更新之后");
session.flush();
//此时customer.customerName为"数据库更新之后"
//但是数据库的customerName依然为数据库更新之前,没改变
System.out.println(customer);
}
refresh(obj)
@Test
public void test9(){
/** * session.refresh(obj) 更新缓存对象 * 当数据库的数据与Session缓存不符时, * 会将Session缓存的对象刷新为最新数据 * 更改的是Session里的对象数据 * 注意事项: refresh()后,对象会添加入Session缓存中 * 需要在hibernate中配置事务隔离级别 * */
Customer customer = (Customer) session.get(Customer.class,1);
//此时customer.customerName为"数据库更新之前"
System.out.println(customer.getCustomerName());
//添加断点,此时手动更改数据库customerName为数据库更新之后
customer.setCustomerName("数据库更新之后");
session.refresh(customer);
//此时customer.customerName为"数据库更新之前"
System.out.println(customer);
System.out.println("测试完毕");
}
clear()
@Test
public void test10(){
/** * session.clear() : * 删除session的缓存对象,但不会删除对应的数据库数据 * */
Customer customer = (Customer) session.get(Customer.class,2);
Order order = (Order) session.get(Order.class,2);
//清空Session所有缓存
session.clear();
Customer customer1 = (Customer) session.get(Customer.class,2);
Order order1 = (Order) session.get(Order.class,2);
//此时发送了四条查询语句,说明没有拿session的缓存对象,
//证明session.clear()生效
//再次查询Customer与Order时再次发送查询语句
}
save(obj)
@Test
public void test11(){
/** * session.save(obj) * 将一个临时对象转换为持久化对象,在flush()时会发送一条insert语句 * 注意事项 : * 在调用save()之前,对对象setId()是无效的 * 在调用save()之后,对对象setId()对抛出异常 * */
Customer customer = new Customer();
customer.setCustomerName("sss");
//设置ID无效
//customer.setCustomerId(100);
session.save(customer);
//设置ID抛异常
//customer.setCustomerId(100);
}
persist(obj)
@Test
public void test12(){
/** * session.persist(obj) * 将一个临时对象转换为持久化对象,在flush()时会发送一条insert语句 * 与save()的不同点: * 在persist()与之后都不能对对象设置ID,否则抛出异常 * */
Customer customer = new Customer();
customer.setCustomerName("ss");
//设置ID抛异常
//customer.setCustomerId(100);
session.persist(customer);
//设置ID抛异常
//customer.setCustomerId(100);
}
get() 与 load()
@Test
public void test13(){
/** * get() 与 load() : * 向数据库查询指定ID的记录 * * 注意事项 : * 1 : get()为立即检索 * load()为延迟检索,返回代理对象 * 2 : 如果数据库没有对应ID,且session没有释放资源 * get()返回null * load()返回的对象在使用时会抛出异常 * 3 : load()之后,如果session释放资源, * 再次调用load()返回的对象会抛出异常 * * */
//ID:333在数据库中并不存在
Customer customer1 = (Customer) session.get(Customer.class,333);
Customer customer2 = (Customer) session.load(Customer.class,333);
/***********************************************************/
//返回null
//System.out.println(customer1);
/***********************************************************/
//抛出异常
//System.out.println(customer2.getCustomerName());
/***********************************************************/
//session.close();
//关闭session后调用customer2抛出异常
//System.out.println(customer2.getCustomerName());
}
update(obj)
@Test
public void test14(){
/** * session.update(obj) ; * 更新数据库,使当前对象数据与数据库一致,也会将游离对象 * 转化为持久化对象 * * 注意事项 : * 1 : 一般情况下,不需要显示调用update(),因为后面会提交事务, * 提交事务时会更新数据库 * 2 : 当get()出对象后,释放了session,此时对get()出的对象 * 进行任何set操作都是无效的,要想将set后的数据更新到数据库, * 需要调用update() * 3 : 如果session中有两个有两个相同ID的对象, * 那么在update()时会抛出异常 * */
/************************************************************/
/*Customer customer = (Customer) session.get(Customer.class,3); //关闭 transaction.commit(); session.close(); //重新开启session session = sessionFactory.openSession(); transaction = session.beginTransaction(); //设置name值 customer.setCustomerName("sss"); //显示调用更新 session.update(customer);*/
/************************************************************/
Customer customer = (Customer) session.get(Customer.class,3);
//关闭
transaction.commit();
session.close();
//重新开启session
session = sessionFactory.openSession();
transaction = session.beginTransaction();
//设置name值
customer.setCustomerName("sss");
//此时session中存在了两个相同ID的对象
Customer customer1 = (Customer) session.get(Customer.class,3);
//抛出异常
session.update(customer);
}
saveOrUpdate()
@Test
public void test15(){
/** * session.saveOrUpdate() 保存或更新 * 注意事项 : 一般根据对象是否存在ID来判断是进行更新或保存 * */
Customer customer1 = (Customer) session.get(Customer.class,3);
customer1.setCustomerName("ss");
//调用的是update
session.saveOrUpdate(customer1);
Customer customer2 = new Customer();
//调用的是save
session.saveOrUpdate(customer2);
}
delete()
@Test
public void test16(){
/** * session.delete() : * 将一个对象记录在数据库中删除 * 注意事项 : * 1 : 当执行delete()后,在没有提交事务之前, * 不能对对象进行save和update了,因为delete()后对象的ID * 依旧存在,所以不能save,且delete()后默认为真的删除, * 所以不能update() * 2 : 游离对象与持久化对象都能删除 * 3 : 如果对象ID在数据库不存在,delete()抛异常 * */
/***********************************************************/
//ID不存在,删除抛异常
//Customer customer = (Customer) session.get(Customer.class,333);
//session.delete(customer);
/***********************************************************/
/*Order order = (Order) session.get(Order.class,1); //关闭 transaction.commit(); session.close(); //重新开启session session = sessionFactory.openSession(); transaction = session.beginTransaction(); //删除游离对象 session.delete(order);*/
}
evict(obj)
@Test
public void test17(){
/** * session.evict(obj) * 将某对象从session缓存中删除 * 但不会删除对应的数据库记录 * */
Order order1 = (Order) session.get(Order.class,2);
//移除
session.evict(order1);
//一共发送了两次查询语句,说明order1已经被移除,在缓存中不存在了
Order order2 = (Order) session.get(Order.class,2);
}