hibernate自动刷新不正确?

时间:2016-04-16 08:39:03

标签: java hibernate

我正在使用hibernate 4.3.10.Final,mysql 5.6。

对于刷新模式,默认为'自动',对吗? 在这种情况下,如果有关于持久性A的步骤,选择B,commit,那么hibernate应首先执行select B,然后坚持A,对吗?

(我在https://dzone.com/articles/dark-side-hibernate-auto-flush上得到了这个理解基础,还是我误解了这篇文章?)

如果我的理解是正确的,为什么我的以下代码会显示不同的结果(我不会手动设置刷新模式):

public class HibernateUtil {

private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {       
    try {
        Configuration config = new Configuration();
        config.configure("resources/hibernate.cfg.xml");
        ServiceRegistry registry = new StandardServiceRegistryBuilder()
        .applySettings(config.getProperties()).build();
        return config.buildSessionFactory(registry);

    }catch(Throwable ex) {          
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

}

factory = HibernateUtil.getSessionFactory();
s = factory.openSession();

s.beginTransaction();
Student a = new Student();
a.setAge(30);
a.setName("test");
s.persist(a);

Query query = s.createQuery("from Address");        
List<Address> list = query.list();
for(Address addr : list) {
    System.out.println(addr.getId()+", "+addr.getZipCode());
}

s.getTransaction().commit();
s.close();
factory.close();

学生&#39;看起来像:

@GeneratedValue(strategy=GenerationType.AUTO)
private int id; 

,地址的ID也是GenerationType.AUTO。

我的hibernate配置文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>    
    <session-factory>       
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password"/>        
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>        
        <property name="connection.pool_size">1</property>        
        <property name="current_session_context_class">thread</property>        
        <property name="hibernate.cache.region.factory_class">
            org.hibernate.cache.ehcache.EhCacheRegionFactory
        </property>
        <property name="hibernate.cache.use_second_level_cache">true</property>

        <property name="net.sf.ehcache.configurationResourceName">resources/ehcache.xml</property>
        <property name="show_sql">true</property>       
        <property name="hbm2ddl.auto">update</property>

        <mapping class="com.my.hibernate.basic.Student" />      
        <mapping class="com.my.hibernate.basic.Address" />      
    </session-factory>
</hibernate-configuration>

那么为什么上面代码的hibernate语句如下:

  

Hibernate:插入学生(年龄,姓名)值(?,?)

     

Hibernate:选择address0_.id为id1_0_,address0_.zipCode为   zipCode2_0_来自地址address0 _

不应该是:首先选择地址然后插入学生,因为我使用&#39; auto&#39;刷新模式和这两个语句是相关的吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

从文档中:

6.1。自动冲洗

  

默认情况下,Hibernate使用自动刷新模式来触发刷新   在以下情况下:

     
      
  • 在提交交易之前

  •   
  • 在执行与排队的JPQL / HQL查询重叠之前   实体动作

  •   
  • 在执行任何未注册的本机SQL查询之前   同步

  •   

来源:https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#flushing-auto

因此,在您的情况下,第2点是正确的,因为您说这两个语句是相关的。 (我假设您的意思是地址与学生有关)