java - 使用 java hibernate criteria API 作为单个查询进行选择和更新

标签 java sql hibernate criteria-api nhibernate-criteria

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

现在我的问题是我想运行此应用程序的多个实例,但阻止程序可能会被不同的实例选择同一行,因为选择并将状态更新为“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”,但我猜这不起作用,因为查询是由在这种情况下,Hibernate 最后没有“for update”。

有人可以帮我吗

最佳答案

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

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

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

关于java - 使用 java hibernate criteria API 作为单个查询进行选择和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10789576/

相关文章:

hibernate - 是否可以停止 jpa 中的连接?

java - 如何使用 hibernate xml 创建一个实体的多个版本?

java - collat​​z 序列 - 优化代码

java - 在main中调用其他类的方法

mysql - MySQL 5.5 中大量 INSERT 语句锁定其他表上的插入

.NET 十进制 = SQL 中的什么?

sql - 在一张表中包含多个外键是一种好习惯吗?

java - 如何比较包含相同字符的 2 个字符串

java - Selenium 服务器在被 SIGTERM 杀死后不绑定(bind)到套接字

Hibernate/JPA 无法进行预加载