当前位置: 首页 > 知识库问答 >
问题:

Hibernate自动冲洗不正确?

吴均
2023-03-14

我用的是Hibernate4.3.10,最后是mysql 5.6。

对于刷新模式,默认为“自动”,对吗?在本例中,如果有关于持久化A、选择B、提交的步骤,那么hibernate应该先执行选择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();

学生看起来像:

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

地址的id也是GenerationType。汽车也是。

我的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:选择地址0。id为id1_0_,地址为0_。zipCode作为zipCode2_0_u来自地址0_

不是应该是:先选择地址,然后插入学生,因为我使用“自动”刷新模式,这两个语句是相互依赖的吗?

提前谢谢!

共有1个答案

谭曦
2023-03-14

从留档:

6.1. 自动冲洗

默认情况下,HiberNate使用AUTO刷新模式,在以下情况下触发刷新:

>

  • 在提交事务之前

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

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

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

    所以在你的例子中,第2点是正确的,因为你说这两个陈述是相互依赖的。(我猜你的意思是地址与学生有关)

  •  类似资料:
    • 问题内容: '; ob_flush(); flush(); 我有专用的服务器,因此可以进行更改。我正在运行apache和nginx作为代理服务器。 问题答案: 您正在使用,而没有,因此没有需要冲洗的东西。 它还取决于Web服务器和代理及其设置。 您应该禁用Nginx的缓冲(添加到配置文件并重新启动Nginx) 另外,检查您的 php.ini是否 包含和。

    • 问题内容: 如我的标题所述,我在应用程序中使用了hibernate刷新模式机制。因此,当我更改hibernate持久对象中的任何数据时,它会自动反映在数据库中。我不要这个 因此,我找到了使用FlushMode的解决方案。 所以这是我的实际问题: 最好使用冲洗模式代替?和 文档中此声明的含义是什么? 有时在执行查询之前会刷新会话,以确保查询从不返回过时状态。 http://docs.jboss.or

    • 我集成了Zxing QR扫描仪库。这是我的应用程序/版本。格拉德尔 在方法中,我有 所以,当应用程序启动时,冲洗灯打开。然后我按下“启动QR扫描仪”按钮,启动QR扫描仪,我得到了预期的解析结果。 这是用于解析二维码的代码: 我的问题是: ZXing QR扫描仪会自动关闭闪光灯(我的要求是在黑暗环境中扫描,因此必须有灯光) 我还发布了日志的一部分: 我怎样才能保持齐平灯打开?

    • 问题内容: 我在php页面中使用了无限循环功能,它每秒都会回显一个文本。当我在浏览器中打开页面时,它起作用了!但是当我通过jquery ajax加载它时没有响应! php页面 jQuery代码 问题答案: 不能仅使用$ .get来完成HTTP流传输 插入如下:http : //ajaxpatterns.org/archive/HTTP_Streaming.php。 HTTP流是一个非常复杂的技巧。

    • 本文向大家介绍C++ 冲洗刷新流,包括了C++ 冲洗刷新流的使用技巧和注意事项,需要的朋友参考一下 示例 默认情况下,文件流以及许多其他类型的流都被缓冲。这意味着写入流可能不会导致基础文件立即更改。为了迫使所有缓冲的写操作立即进行,可以刷新流。您可以直接通过调用flush()方法或通过std::flush流操纵器来执行此操作: 有一个流操纵器std::endl,结合了编写换行符和刷新流: 缓冲可以

    • 问题内容: 这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 7年前关闭。 我有带有Hibernate和Spring框架的Maven项目。我希望Hibernate自动创建表,但是只是删除所有现有表,并且不创建所需的表。在会话工厂初始化期间不会引发任何异常,但是当我