hibernate中Session.flush()方法介绍
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方法执行性才执行插入语句。
