Создание объекта базы данных в одном потоке и попытка получить тот же объект в другом потоке дает другой результат - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать сценарий, в котором я создаю сущность в главном потоке, а затем использую другой поток, чтобы запросить ту же сущность, которая была только что создана.Однако, если я выполню запрос для извлечения сущности за пределы потока, он вернет значение.Однако, если я сделаю запрос в потоке, я получу null.Я приложил исходный код с комментариями и постарался сделать его простым.Буду признателен, если кто-нибудь может помочь мне указать на проблемуЯ использую JPA и Spring framework.Для базы данных я использую 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();
}

1 Ответ

0 голосов
/ 01 июня 2018

Указывает на примечание:

  • Spring применяет транзакцию к вашему тестовому методу и по умолчанию откатывает транзакцию обратно по завершении метода.

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

  • Транзакции Spring не распространяются на новые потоки.

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

Поэтому метод завершает и откатывает транзакцию перед поиском вновый поток выполняется.

Если вы добавите аннотацию @Commit в свой метод тестирования, запись должна быть найдена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...