我正在使用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;刷新模式和这两个语句是相关的吗?
提前致谢!
答案 0 :(得分:0)
从文档中:
6.1。自动冲洗
默认情况下,Hibernate使用自动刷新模式来触发刷新 在以下情况下:
在提交交易之前
在执行与排队的JPQL / HQL查询重叠之前 实体动作
在执行任何未注册的本机SQL查询之前 同步
因此,在您的情况下,第2点是正确的,因为您说这两个语句是相关的。 (我假设您的意思是地址与学生有关)