1、flush()方法是使数据库表中的记录和Session缓存中的对象的状态保持一致,为了保持一致,则可能会发送对应的ssql语句。在Transaction的commit()方法中:调用session的flush方法,再提交事务。
2、flush()方法可能会发送sql语句,但不会提交事务。package com.gwolf;import java.util.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.gwolf.domain.News;public class HibernateTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init() { //创建Configuration对象 Configuration configuration = new Configuration().configure(); //创建一个ServiceRegistry对象,hibernate的任何配置和服务都需要在该对象中注册后才有效 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder(). applySettings(configuration.getProperties()).buildServiceRegistry(); //创建一个SessionFactory对象 sessionFactory = configuration. buildSessionFactory(serviceRegistry); //创建一个Session对象 session = sessionFactory.openSession(); //开启事务 transaction = session.beginTransaction(); } @After public void destroy() { //提交事务 transaction.commit(); session.close(); sessionFactory.close(); } @Test public void test() { News news = (News)session.get(News.class, 1); news.setAuthor("oracle16"); session.flush(); } }package com.gwolf;import java.util.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.gwolf.domain.News;public class HibernateTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init() { //创建Configuration对象 Configuration configuration = new Configuration().configure(); //创建一个ServiceRegistry对象,hibernate的任何配置和服务都需要在该对象中注册后才有效 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder(). applySettings(configuration.getProperties()).buildServiceRegistry(); //创建一个SessionFactory对象 sessionFactory = configuration. buildSessionFactory(serviceRegistry); //创建一个Session对象 session = sessionFactory.openSession(); //开启事务 transaction = session.beginTransaction(); } @After public void destroy() { //提交事务 transaction.commit(); session.close(); sessionFactory.close(); } @Test public void test() { News news = (News)session.get(News.class, 1); news.setAuthor("oracle165"); session.flush(); } }
3、在未提供事务或显示的调用session.flush()方法之前,也有可能会进行flush()操作。执行HQL或QBC查询会先调用flush()操作,以得到数据表的最新记录。package com.gwolf;import java.util.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.gwolf.domain.News;public class HibernateTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init() { //创建Configuration对象 Configuration configuration = new Configuration().configure(); //创建一个ServiceRegistry对象,hibernate的任何配置和服务都需要在该对象中注册后才有效 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder(). applySettings(configuration.getProperties()).buildServiceRegistry(); //创建一个SessionFactory对象 sessionFactory = configuration. buildSessionFactory(serviceRegistry); //创建一个Session对象 session = sessionFactory.openSession(); //开启事务 transaction = session.beginTransaction(); } @After public void destroy() { //提交事务 transaction.commit(); session.close(); sessionFactory.close(); } @Test public void test() { News news = (News)session.get(News.class, 1); news.setAuthor("oracle1652"); News news2 = (News) session.createCriteria(News.class).uniqueResult(); System.out.println(news2); } }
4、我们查看控制台打印的sql语句,在执行查询之前,首先执行了更新操作。
5、若记录的id是由底层数据库使用自增的方式生成的,则在调用save()方法后,就会立即发送insert语句,因为save方法后,必须保证对象的id是存在的。package com.gwolf;import java.util.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.gwolf.domain.News;public class HibernateTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init() { //创建Configuration对象 Configuration configuration = new Configuration().configure(); //创建一个ServiceRegistry对象,hibernate的任何配置和服务都需要在该对象中注册后才有效 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder(). applySettings(configuration.getProperties()).buildServiceRegistry(); //创建一个SessionFactory对象 sessionFactory = configuration. buildSessionFactory(serviceRegistry); //创建一个Session对象 session = sessionFactory.openSession(); //开启事务 transaction = session.beginTransaction(); } @After public void destroy() { //提交事务 transaction.commit(); session.close(); sessionFactory.close(); } @Test public void test() { News news = new News("mysql", "aa", new Date()); session.save(news); } }
6、从控制台打印的sql语句可以看出,在提交事务之前,sql语句已经执行了,如果id是hibernate生成,则会在commit方法执行性才执行插入语句。