Hibernate:为什么在这种情况下最后执行插入操作?

时间:2012-06-18 10:39:02

标签: hibernate

我正在使用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());

当我在hibernate配置文件中使用show_sql时,使用此行输出

选择查询

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 (?, ?, ?)

有人可以告诉我为什么Hibernate Engine最后执行Insert操作,即使Session.persist高于get方法吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

一个更有趣的问题是为什么在<{em> SELECT之前有INSERT 。它可能与Hibernate填充其第一级缓存有关,或者可能是由于您未显示的某些前面的代码。