【问题标题】:Do select and update as a single query using java hibernate criteria API使用 java hibernate criteria API 作为单个查询进行选择和更新
【发布时间】:2012-06-03 02:40:45
【问题描述】:

我编写了一个应用程序,它一次从 Oracle Db 中的一个表中读取 1 条记录,对其进行一些处理,然后将其再次保存到同一个表中。 我还在表中维护一个状态列,以跟踪我当前的记录进度。例如。在选择我将其更新为 'U' 并最后将其更改为 'P' 后,最初的记录状态为 'N'。

现在我的问题是我想运行此应用程序的许多实例,但阻止程序是同一行可能被不同的实例选择,因为选择和更新状态为“U”不是一个单一的查询。所以它可能会发生 Process 1 select then Process2 选择相同的记录,然后 Process1 将状态更新为“U”。我必须解决这个问题才能使我的应用程序分发。

我已经将选择和更新查询创建为单个事务,但我猜是因为这不能解决问题。我的这个逻辑是正确的,对吧?

我正在使用 Hibernate 访问数据库。任何人都知道如何使用 Hibernate java 来实现这一点?

如果我的上述逻辑(关于事务)是正确的,那么我可以通过两种方式来做到这一点,如果其中任何一种是由 hibernate 提供的。

1-在 1 个查询中选择并更新记录

2-选择一行并将其锁定在 1 个查询中,然后在同一事务中运行另一个查询以将状态更新为 'U' 。在 Sql 中,我可以通过在查询结束时使用“for update”来做到这一点,但我不确定如何使用“Hibernate criteria”来做到这一点。Criteria 也有一个 API 'forUpdate',但我猜这不起作用,因为查询由在这种情况下,休眠最后没有“更新”。

有人可以帮我吗

【问题讨论】:

  • 抱歉标准有 'setLockMode' API 而不是 'forUpdate' API
  • 您可以为此编辑您的帖子。

标签: java sql hibernate criteria-api nhibernate-criteria


【解决方案1】:

是的,可以使用条件进行一次查询。

我正在写一个例子。希望对你有帮助。

public void updateEmployee(int empid,String firstname, String lastname, String email)
{
    sf=connect(); // get connection
    Session session=sf.openSession();
    Transaction t=session.beginTransaction();

    Employee emp= (Employee) session.get(Employee.class, empid);
    emp.setFirstname(firstname);
    emp.setLastname(lastname);
    emp.setEmail(email);

    session.update(emp);  // Update employee
    t.commit();
    session.close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 2019-02-05
    • 1970-01-01
    • 2017-06-11
    • 2011-05-14
    • 1970-01-01
    • 2013-07-24
    • 2011-02-25
    相关资源
    最近更新 更多