天天看点

session的作用及使用时的注意点

最近学习了hibernate,对涉及到的session做一个简单总结!!!!!!

一:

* flush: 使数据表中的记录和 Session 缓存中的对象的状态保持一致. 为了保持一致, 则可能会发送对应的 SQL 语句.

* 1. 在 Transaction 的 commit() 方法中: 先调用 session 的 flush 方法, 再提交事务

* 2. flush() 方法会可能会发送 SQL 语句, 但不会提交事务. 

* 3. 注意: 在未提交事务或显式的调用 session.flush() 方法之前, 也有可能会进行 flush() 操作.

* 1). 执行 HQL 或 QBC 查询, 会先进行 flush() 操作, 以得到数据表的最新的记录

* 2). 若记录的 ID 是由底层数据库使用自增的方式生成的, 则在调用 save() 方法时, 就会立即发送 INSERT 语句. 

* 因为 save 方法后, 必须保证对象的 ID 是存在的!

*/

commit和flush的区别:flush完下一步是执行一系列的SQL语句,但是没有提交事务。

commit是先执行flush的操作,然后提交事务,提交事务也就意味着SQL语句更新的数据被同步到数据库即实现了持久化。

二:

customer表的id是order表的外键,通过

@Test

public void testUpdat2(){

Customer customer = (Customer) session.get(Customer.class, 1);

customer.getOrders().iterator().next().setOrderName("GrG"); 

}

@Test

public void testUpdate(){

Order order = (Order) session.get(Order.class, 1);

order.getCustomer().setCustomerName("FFF");

}

发现testUpdate没有更新数据,而testUpdate2完成了数据更新

三:

refresh(): 会强制发送 SELECT 语句, 以使 Session 缓存中对象的状态和数据表中对应的记录保持一致!

@Test

public void testRefresh(){

News news = (News) session.get(News.class, 1);

System.out.println(news);

session.refresh(news); 

System.out.println(news); 

}

注意mysql数据库的事务隔离级别默认是可重复读,应该调用

利用控制台进行mysql的控制

win+r

在命令行里输入cmd,进入控制台

输入

>mysql -uroot -p111111;

>show databases;

>use atguigu;

>selsect * from customer;

>select @@tx_isolation; 

设置当前musql连接的隔离级别。

>set transaction isolation level read committed;

设置数据库系统的全局的隔离级别。

>set globaltransaction isolation level read committed;

设为 读已提交

四:

clear(): 清理缓存,意味着需要再次提交sql语句,进行commit操作。

@Test

public void testClear(){

News news1 = (News) session.get(News.class, 1);

session.clear();

News news2 = (News) session.get(News.class, 1);

}