2

我正在使用 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 方法之上?

4

2 回答 2

1

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

于 2012-06-18T11:04:07.057 回答
0

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

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

于 2012-06-18T10:44:35.757 回答