gpt4 book ai didi

spring - Hibernate - 更新后表锁定

转载 作者:行者123 更新时间:2023-12-02 08:04:40 25 4
gpt4 key购买 nike

我正在通过使用 Hibernate 和 EntityManager 的方法执行更新。

此更新方法被调用多次(在循环内)。

似乎当我第一次执行它时,它锁定了表并且不释放它。

关闭应用程序后尝试通过 SQL Developer 更新表时,我看到表仍然处于锁定状态,因为更新挂起。

您认为解决此问题的方法是什么?如果您需要更多信息,请告诉我。

类别

@Repository
@Transactional(propagation = REQUIRES_NEW)
public class YirInfoRepository {

@Autowired
EntityManager entityManager;

@Transactional(propagation = REQUIRES_NEW)
public void setSent(String id) {
String query = "UPDATE_QUERY";
Query nativeQuery = entityManager.createNativeQuery(String.format(query, id));
nativeQuery.executeUpdate();
}
}
<小时/>

更新

等了一个多小时后,我再次启动了该应用程序,曾经运行良好,但现在又挂起。

<小时/>

更新 2——我会给任何帮助我解决这个问题的人最大的赏金

在另一个地方,我使用应用程序管理的实体管理器,但它仍然给我带来相同类型的错误。

public void fillYirInfo() {
File inputFile = new File("path");
try (InputStream inputStream = new FileInputStream(inputFile);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
bufferedReader.lines().skip(1).limit(20).forEach(line -> {
String[] data = line.split(",");
String rnr = data[0];
String linked = data[1];
String email = data.length > 2 ? data[2] : "";



String insuredId = insuredPeopleRepository.getInsuredIdFromNationalId(rnr);
int modifiedCounter = 0;

if (!isNullOrEmpty(insuredId)) {
EntityManager entityManager = emf.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
Query nativeQuery = entityManager.createNativeQuery(
"QUERY"
);
transaction.begin();
nativeQuery.executeUpdate();
entityManager.flush();
transaction.commit();
entityManager.close();
}

System.out.println(modifiedCounter + " rows modified");
});
} catch (IOException e) {
e.printStackTrace();
}
}

最佳答案

尝试不使用更新查询:

@Repository
@Transactional(propagation = REQUIRES_NEW)
public class YirInfoRepository {

@Autowired
EntityManager entityManager;

@Transactional(propagation = REQUIRES_NEW)
public void setSent(String id) {
//guessing your class name and method..
final YirInfo yirInfo = entityManager.find(YirInfo.class, id);
yirInfo.setSent();
}
}

可能不如单个更新查询那么快,但可以相当快地获得它,除非数据量很大。这是使用 Hibernate/JPA 的首选方式,您无需考虑单个值和 SQL 查询,而是使用实体/对象和(有时)HQL/JPQL 查询。

关于spring - Hibernate - 更新后表锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49388979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com