使用java hibernate criteria API选择并更新为单个查询

时间:2012-05-28 19:29:34

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

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

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

我已经将select和update查询创建为单个事务,但我猜是因为这不能解决问题。我的逻辑是正确的吗?

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

如果我的上述逻辑(关于事务)是正确的,那么如果hibernate提供任何这些逻辑,我可以通过2种方式执行此操作。

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

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

有人可以帮助我吗

1 个答案:

答案 0 :(得分:2)

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

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

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();
}