【问题标题】:Hibernate : Why Insert operation is performed last in this case?Hibernate:为什么在这种情况下最后执行插入操作?
【发布时间】:2012-06-18 10:39:02
【问题描述】:

我正在使用 Hibernate 插入数据并使用相同的会话获取数据,如下所示

StudentBean st1 = new StudentBean();

st1.setSid(513);
st1.setSname("Ravi)");
st1.setTotMarks(0.0f);

Session sess = factory.openSession();
sess.persist(st1);

StudentBean   st2 = (StudentBean) sess.get(StudentBean.class, 510);
System.out.println(st2.getSname());

当我在休眠配置文件中使用 show_sql true 时,输出为

选择查询

Hibernate: select studentbea0_.sid1 as sid1_0_0_, studentbea0_.sname1 as sname2_0_0_, studentbea0_.tot_m1 as tot3_0_0_ from student1 studentbea0_ where studentbea0_.sid1=?

插入查询

insert into student1 (sname1, tot_m1, sid1) values (?, ?, ?)

有人可以告诉我为什么插入操作是最后由休眠引擎执行的,即使 Session.persist 在 get 方法之上??

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    当您调用 persist() 时,实例不会立即保存到数据库中。它只是保存在休眠会话(一级缓存)中。当您调用 get() 时,休眠首先检查会话中是否有 id 为 510 的学生,但没有找到它,因此转到数据库。这会生成选择。当会话被刷新时(即当您调用 session.close() 时),会话中的所有实例都会被检查,并且任何更改都会被写入数据库。这会生成插入。此外,如果您更改了 510 的任何属性,它们将被自动写出,生成更新。

    【讨论】:

      【解决方案2】:

      显然,Hibernate 假定它独自拥有您正在使用的数据库,并且“知道”有问题的记录不能被数据库的另一个用户背后更改。因此,您的 Session.get() 不会触发 SQL SELECT,而是仅从 Hibernate 的缓存中返回该对象。

      一个更有趣的问题是为什么SELECT之前INSERT。这可能与 Hibernate 填充其一级缓存有关,也可能是由于您未显示前面的某些代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-05
        • 2017-11-26
        • 2010-12-29
        相关资源
        最近更新 更多