Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate 3 SqlQuery在executeUpdate期间立即刷新_Java_Sql_Hibernate_Flush - Fatal编程技术网

Java Hibernate 3 SqlQuery在executeUpdate期间立即刷新

Java Hibernate 3 SqlQuery在executeUpdate期间立即刷新,java,sql,hibernate,flush,Java,Sql,Hibernate,Flush,我使用hibernate进行一些大容量加载到表中,但发现使用子查询可以大大提高性能——但由于这是一条insert语句,我不得不将其作为本机SQLQuery对象编写。但是我发现使用这个方法hibernate似乎总是在调用executeUpdate()时立即刷新查询。这是非常低效的,如果插入像其他hibernate插入一样捆绑和刷新在一起,那么性能会更好 我已经为会话和查询本身设置了FlushMode,但是没有任何改变。我找不到任何关于SQLQuery如何与刷新模式相关的特定文档 所以这段代码并不像

我使用hibernate进行一些大容量加载到表中,但发现使用子查询可以大大提高性能——但由于这是一条insert语句,我不得不将其作为本机SQLQuery对象编写。但是我发现使用这个方法hibernate似乎总是在调用executeUpdate()时立即刷新查询。这是非常低效的,如果插入像其他hibernate插入一样捆绑和刷新在一起,那么性能会更好

我已经为会话和查询本身设置了FlushMode,但是没有任何改变。我找不到任何关于SQLQuery如何与刷新模式相关的特定文档

所以这段代码并不像看上去那样有效

Session s = getSession();
s.beginTransaction()
SQLQuery insert = s.createSQLQuery("insert into mytable (mycolumn) values ('myvalue');")
//flush mode should mean that inserts are not flushed until flush() is called
insert.setFlushMode(FlushMode.MANUAL); 
insert.executeUpdate();
//insert has already been executed here so flush does nothing
s.flush(); 

有人知道我是否可以强制hibernate以与实体插入相同的方式对本机SQLQuery插入进行排队吗?

您可以使用事务…您实际上是通过调用
executeUpdate()来调用flush。使用
tx=session.beginTransaction()
声明会话后打开事务,并在不确定我是否理解时调用
tx.commit()
。我的代码示例不完整。我肯定在创建一个交易。另外,您的意思是我不应该调用executeUpdate()?如果我不调用executeUpdate(),那么无论我是否调用flush/commit/etc,SQL都不会执行。创建查询不会执行它,flush也不会。只有executeQuery告诉hibernate您确实想要执行它。我要指出的是,hibernate通常会像这样进行插入,并将其保存在内存中,然后与其他程序一起作为批处理执行,但在这种情况下,它会立即执行,我想防止这种情况发生。