JPA Hibernate обновляет сущность, но в БД нет никаких изменений - PullRequest
0 голосов
/ 13 февраля 2019

Короче говоря, у меня есть три метода:

    @Transactional(propagation=Propagation.REQUIRED, noRollbackFor=Exception.class)
    public void Manage(long bookId) throws Exception {

        Book book = dao.getByKey(bookId);

        //...

        register(book);

    }


    @Transactional(propagation=Propagation.REQUIRED, noRollbackFor=Exception.class)
    public void register(Book book) {

        try {

            // updateSomeId method should be called in another thread
            // POST request to the service, waiting for the response then updating the DB
            Runnable task = () -> {

                if(someId > 0) {
                    dao.updateSomeId(book, someId);

            }
            Thread thread = new Thread(task);
            thread.start();
        } catch (Exception e) {

        }

    }



    @Transactional(propagation=Propagation.REQUIRED, noRollbackFor=Exception.class)
    public void updateSomeId(Book book, long someId) {
        try {
            Book findedBook = getByKey(book.getBookId());
            findedBook.setSomeId(someId);
        } catch (Exception e) {
            logger.error("error", e);
        }
    }

updateSomeId метод должен обновить свойство someId в таблице Book.
В журнале я вижу: Hibernate: update Book set author=?, someId=? where bookId=?

Но в моей БД нет никаких изменений, никаких ошибок.Может ли кто-нибудь объяснить, что происходит и как это решить? Это одно из тысяч обновлений, которые у меня есть, и только в этом случае оно не обновило таблицу БД.

JPA 2.1

Hibernate 5.2.10. Финал

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Может быть, ваш главный поток не ожидает обновления задачи потока.Поэтому контейнер не может зафиксировать вашу транзакцию.Можете ли вы изменить свой метод регистрации, как показано ниже, и попробовать?

   @Transactional(propagation=Propagation.REQUIRED, noRollbackFor=Exception.class)
    public void register(Book book) {

        try {

            // updateSomeId method should be called in another thread
            Runnable task = () -> {

                if(someId > 0) {
                    dao.updateSomeId(book, someId);

            }
            Thread thread = new Thread(task);
            thread.start();
            thread.join();//this tells the main thread to wait until it finishes execution.

        } catch (Exception e) {

        }

    }
0 голосов
/ 13 февраля 2019

Вы пытаетесь обновить только поле someId в findedBook объекте, но в журнале Hibernate: update Book set author=?, someId=? where bookId=? оператор обновления отображает несколько полей author=?, someId=?, кажется, что зарегистрированный оператор не предназначен для текущей операции.

  • Создайте новый метод в классе дао с оператором как session.update(book) и вызовите тот же метод из updateSomeId метода и передайте book объект в качестве параметра.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...