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

来源:互联网 发布:sql检查字段是否存在 编辑:程序博客网 时间:2024/06/07 12:12

最近学习了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);
}

0 0