我正在使用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方法吗?
答案 0 :(得分:1)
当您调用persist()时,实例不会立即保存到数据库中。它只是保存在hibernate会话中(第一级缓存。)当你调用get()时,hibernate首先检查会话为id为510的Student,但是找不到它,所以转到数据库。这会生成选择。刷新会话时(即调用session.close()时)会检查会话中的所有实例,并将所有更改写入数据库。这会生成插入。此外,如果您更改了510的任何属性,它们将自动写出,生成更新。
答案 1 :(得分:0)
显然Hibernate假设它独自拥有你正在使用的数据库,并且“知道”有问题的记录不能被数据库的另一个用户在其背后改变。因此,Session.get()
不会触发SQL SELECT
,而是从Hibernate的缓存中返回对象。
一个更有趣的问题是为什么在<{em> SELECT
之前有INSERT
。它可能与Hibernate填充其第一级缓存有关,或者可能是由于您未显示的某些前面的代码。