【问题标题】:Hibernate session.get(..) method not hitting databaseHibernate session.get(..) 方法没有命中数据库
【发布时间】:2013-06-14 03:27:41
【问题描述】:

Hibernate 的新手。 我只是想了解session.get() 方法“如果对象已被缓存,则避免数据库命中”

List<Employee> employees1 = session.createCriteria(Employee.class).list();

Main main = new Main();
try {
    synchronized (main) {
        main.wait(10000);
    }
} catch (InterruptedException e) {e.printStackTrace();}

Employee  employees2 = (Employee)session.get(Employee.class, new Long(1));
System.out.println(employees2.getFirstname() + " , "+ employees2.getLastname() );
  1. 在第一行中,我得到了一条记录,名字为“Kevin”,姓氏为“Papad”

  2. 在等待时,我进入数据库并将名字更改为“史蒂夫”

  3. session.get() 没有访问数据库并让我将 firstname 作为 'Kevin' lastname 作为 'Papad' 的值,这是错误的。

我一直在等待,因为任何人都可以同时更改数据库中的值(在上面的第 1 步和第 3 步之间),在这种情况下,我怎样才能在第 3 步中获得正确的值?即,“史蒂夫”的名字

我需要对我的代码进行哪些更改?

如果我的理解/方法有误,请纠正我。

【问题讨论】:

  • 详情可以从线程stackoverflow.com/questions/8044963/…了解。该线程存在 get 和 load 方法的缺陷。
  • 此外,休眠会话不是线程安全的,根据api建议,不建议长时间保持会话打开,每次工作后都应打开和关闭。

标签: hibernate


【解决方案1】:

您可以使用要重新加载的实体调用session.refresh(Object)http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#objectstate-loading

注意:Javadoc 中有关于此用法的警告,请参阅此thread 进行讨论。

【讨论】:

  • 所以,如果我每次调用 session.get() ,我需要使用 session.refresh(Object) 吗?
  • 如果您不知道该实体是否已加载并且您必须拥有它的最新版本,那么我认为可以。顺便说一句,您不必在示例中调用 get()。你用第一行加载了整个表。因此,您可以遍历列表并检查带有id == 1 的列表。
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
相关资源
最近更新 更多