Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一个线程中创建一个数据库实体,并尝试在另一个线程中检索同一实体,结果不同_Java_Multithreading_Jpa - Fatal编程技术网

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。又名调试。。。