为什么在Hibernate中的session.delete()之后需要调用session.flush()?

高朗·帕特尔(Gaurang Patel)

问题是以下代码片段未删除数据库中的记录。

import org.hibernate.Session;
import org.hibernate.SessionFactory;
...
...
void deleteForm() {
   Session session = sessionFactory.openSession();
   FormDO formDO = new FormDO();
   formDO.setId(formId);
   session.delete(formDO); // No delete SQL query is getting fired. 

但是,如果我在删除后调用session.flush(),它将运行完美。请注意,我没有使用任何交易。

在Session类的JavaDoc中,delete方法的描述为:

从数据存储中删除持久性实例。参数可以是与接收会话相关联的实例,也可以是具有与现有持久状态相关联的标识符的瞬时实例

而且我在网上看到了许多代码段,这些代码段表明在delete()之后不必调用flush()。类似的问题在其他论坛上提出在这里,但它仍然没有得到答复。

另外,session.save在没有session.flush的情况下也可以正常工作。

我正在使用Hibernate 4.2.16 + Spring 4.0.9 + JPA 1.0注释。以下是供进一步参考的源文件,

FormDO.java

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="form")
    public class FormDO {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    Integer id;
    @Column(name="name")
    String name;
    ...
    ...

弹簧配置文件

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/tempdb" />
        <property name="username" value="root" />
        <property name="password" value="****" />
    </bean>
    <!-- Hibernate 4 SessionFactory Bean definition -->
    <bean id="hibernate4AnnotatedSessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.test.FormDO</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.current_session_context_class">thread</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

FormDAO.java

@Named
public class FormDAO {
    @Inject
    private SessionFactory sessionFactory;

    public boolean deleteForm(Integer formId) {
        Session session = sessionFactory.openSession();
        FormDO formDO = new FormDO();
        formDO.setId(formId);
        session.delete(formDO);
        session.flush(); // If this line is commented, record DOES NOT get deleted
        return true;
    }
    public boolean saveForm(FormDO formDO) { 
       Session session = sessionFactory.openSession();
       session.save(formDO); // Save doesn't require session.flush
       return true;
    }
    ...
    ...

更新:

我的困境主要是由于不一致.. session.save立即插入记录,但是session.delete不会反映出来,除非明确调用flush()。但是,当我参考Afsun发布Flushing the Session链接时,我的疑惑已通过阅读以下内容消除了,

一个例外是,使用本机ID生成的对象在保存时会插入。

我非常感谢每个人发布的答案,因为几乎所有答案都指向正确的方向,但Afsun完全消除了我的怀疑。谢谢!

阿夫孙·汗马德利

通过Hibernate处理数据库时,您正在使用Hibernate sessionHibernate sessions通过以下三种情况刷新到数据库。

  1. commit()-进行交易时
  2. 在运行查询之前
  3. 您打电话的时候 session.flush()

这里最重要的是第二。每次查询后都不会Hibernate session刷新数据库。如果我们Native SQL Query通过Hibernate运行,则Hibernate不知道刷新会话,或者如果HQL运行Hibernate不知道刷新会话。刷新请求将使会话状态与数据库同步。

看到以下内容:之前删除休眠冲洗法拉盛会议

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么要包含stream_flush调用?

来自分类Dev

休眠session.flush()即使设置了自动提交

来自分类Dev

需要PHP Cron Job Flush / OB Flush?

来自分类Dev

为什么Hibernate Session会像这样

来自分类Dev

Hibernate flush()影响事务

来自分类Dev

在php中XMLWriter之后,在flush()之前替换字符串

来自分类Dev

EntityManager.flush有什么作用,为什么我需要使用它?

来自分类Dev

MySQL:何时真正需要MySQL中的Flush Privileges?

来自分类Dev

Spring JPA/Hibernate org.hibernate.AssertionFailure: null id in Entity (don't flush the Session after an exception occurs)

来自分类Dev

将 @Transactional 添加到测试中以避免 org.hibernate.LazyInitializationException no Session 错误。为什么需要它?

来自分类Dev

为什么ofstream :: flush()返回ostream?

来自分类Dev

为什么ofstream :: flush()返回ostream?

来自分类Dev

JDBC查询在同一事务上看不到session.flush修改

来自分类Dev

不明白为什么需要 $_SESSION

来自分类Dev

symfony2在flush()之后无法从数据库中拉出吗?

来自分类Dev

symfony2在flush()之后无法从数据库中拉出吗?

来自分类Dev

PHP-ob_end_flush()之后的输出

来自分类Dev

Response.Redirect() 在 Response.Flush() 之后;

来自分类Dev

使用asyncScheduler和flush进行角度测试-为什么使用flush()失败?

来自分类Dev

Hibernate中的Session和Connection有什么区别?

来自分类Dev

读取时是否需要Flush()FileStream?

来自分类Dev

为什么在onclick事件之后需要function(){...}来调用函数?

来自分类Dev

为什么在std :: move之后需要析构函数调用?

来自分类Dev

为什么我们使用system.out.flush()?

来自分类Dev

为什么Flush torrent客户端无法启动?

来自分类Dev

为什么Flush torrent客户端无法启动?

来自分类Dev

为什么我们使用system.out.flush()?

来自分类Dev

为什么session [:]在葡萄-Rails中不起作用?

来自分类Dev

为什么我不能把 mysql 结果放在 $_SESSION 中

Related 相关文章

  1. 1

    为什么要包含stream_flush调用?

  2. 2

    休眠session.flush()即使设置了自动提交

  3. 3

    需要PHP Cron Job Flush / OB Flush?

  4. 4

    为什么Hibernate Session会像这样

  5. 5

    Hibernate flush()影响事务

  6. 6

    在php中XMLWriter之后,在flush()之前替换字符串

  7. 7

    EntityManager.flush有什么作用,为什么我需要使用它?

  8. 8

    MySQL:何时真正需要MySQL中的Flush Privileges?

  9. 9

    Spring JPA/Hibernate org.hibernate.AssertionFailure: null id in Entity (don't flush the Session after an exception occurs)

  10. 10

    将 @Transactional 添加到测试中以避免 org.hibernate.LazyInitializationException no Session 错误。为什么需要它?

  11. 11

    为什么ofstream :: flush()返回ostream?

  12. 12

    为什么ofstream :: flush()返回ostream?

  13. 13

    JDBC查询在同一事务上看不到session.flush修改

  14. 14

    不明白为什么需要 $_SESSION

  15. 15

    symfony2在flush()之后无法从数据库中拉出吗?

  16. 16

    symfony2在flush()之后无法从数据库中拉出吗?

  17. 17

    PHP-ob_end_flush()之后的输出

  18. 18

    Response.Redirect() 在 Response.Flush() 之后;

  19. 19

    使用asyncScheduler和flush进行角度测试-为什么使用flush()失败?

  20. 20

    Hibernate中的Session和Connection有什么区别?

  21. 21

    读取时是否需要Flush()FileStream?

  22. 22

    为什么在onclick事件之后需要function(){...}来调用函数?

  23. 23

    为什么在std :: move之后需要析构函数调用?

  24. 24

    为什么我们使用system.out.flush()?

  25. 25

    为什么Flush torrent客户端无法启动?

  26. 26

    为什么Flush torrent客户端无法启动?

  27. 27

    为什么我们使用system.out.flush()?

  28. 28

    为什么session [:]在葡萄-Rails中不起作用?

  29. 29

    为什么我不能把 mysql 结果放在 $_SESSION 中

热门标签

归档