Java 在一个线程中创建一个数据库实体,并尝试在另一个线程中检索同一实体,结果不同
我正在尝试创建一个场景,在这个场景中,我在主线程中创建一个实体,然后使用另一个线程查询刚刚创建的同一实体。但是,如果执行查询以获取线程外部的实体,它将返回值。但是,如果我在线程内查询它,就会得到Java 在一个线程中创建一个数据库实体,并尝试在另一个线程中检索同一实体,结果不同,java,multithreading,jpa,Java,Multithreading,Jpa,我正在尝试创建一个场景,在这个场景中,我在主线程中创建一个实体,然后使用另一个线程查询刚刚创建的同一实体。但是,如果执行查询以获取线程外部的实体,它将返回值。但是,如果我在线程内查询它,就会得到null。我已经附上了带有注释的源代码,并试图使其简单化。如果有人能帮我指出这个问题,我将不胜感激。我正在使用JPA和Spring框架。对于数据库,我使用的是postgresql。非常感谢。以下是示例程序: @Test public void test() { Employ
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将向您的测试方法应用一个事务,并在方法完成时默认回滚该事务
- Spring事务不会传播到新线程
如果您将
@Commit
注释添加到您的测试方法中,应该可以找到记录。要回答这个问题,我需要查看更多的代码。还请发布employeeService.createEmployee函数、Employee.setReferenceId方法和employeeQuery.getEmployeeByReferenceId函数。为什么不调试它?查看您使用的JPA提供商的日志。查看一个线程中的提交时间和另一个线程中的读取时间。不要跨线程使用EntityManager。又名调试。。。