gpt4 book ai didi

java - 在一个线程中创建数据库实体并尝试在另一个线程中检索相同的实体给出不同的结果

转载 作者:行者123 更新时间:2023-11-30 06:09:12 25 4
gpt4 key购买 nike

我正在尝试创建一个场景,在主线程中创建一个实体,然后使用另一个线程查询刚刚创建的同一实体。但是,如果我执行查询以获取线程外部的实体,它将返回值。但是,如果我在线程内查询它,我会得到null。我已附上带有注释的源代码,并试图使其变得简单。如果有人能帮我指出这个问题,我将不胜感激。我正在使用 JPA 和 Spring 框架。对于数据库,我使用 postgresql。谢谢。这是示例程序:

    @Test
public void test() {
Employee generatedEmployee = employeeService.createEmployee(passEmployeeInfo()); // CREATE TEST EMPLOYEE.. passEmployeeInfo() just sets name, phone etc.
System.out.println(generatedEmployee.getReferenceId()); //Output is: 20

generatedEmployee.setReferenceId(30L); //update the referenceId here...
long refId = generatedEmployee.getReferenceId();

Employee employeeFromDB = employeeQuery.getEmployeeByReferenceId(refId); //Use refId to get Employee from table
System.out.println(employeeFromDB); //Output is: Employee [id=2, refId=30, ...]

Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Employee employee = employeeQuery.getEmployeeByReferenceId(refId);
System.out.println("The employee inside run method is: " + employee); //Output is NULL here.. This is what I am trying to understand.
}
});
thread.start();
}

最佳答案

注意事项:

  • Spring 会将事务应用于您的测试方法,并默认在方法完成时回滚事务。

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#rollback

  • Spring 事务不会传播到新线程。

https://dzone.com/articles/spring-and-threads-transactions

因此,该方法会在新线程中的查找执行之前完成并回滚事务。

如果您将@Commit注释添加到您的测试方法中,应该可以找到记录。

关于java - 在一个线程中创建数据库实体并尝试在另一个线程中检索相同的实体给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50632701/

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