JPA Hibernate更新了实体,但数据库中没有任何更改

时间:2019-02-13 03:23:04

标签: java spring hibernate jpa

简而言之,我有三种方法:

    @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方法必须更新Book表中的someId属性。
在日志中,我看到: Hibernate: update Book set author=?, someId=? where bookId=?

但是,我的数据库中没有任何更改,也没有任何错误。谁能解释会发生什么以及如何解决? 这是我拥有的数千个更新之一,仅在这种情况下,它还没有更新数据库表。

JPA 2.1

休眠5.2.10.Final

2 个答案:

答案 0 :(得分:0)

可能是您的主线程没有等待更新任务线程。因此,容器无法提交您的交易。您可以像下面那样更改注册方法并尝试一下吗?

   @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) {

        }

    }

答案 1 :(得分:-1)

您正在尝试仅更新someId对象中的findedBook字段,但在日志Hibernate: update Book set author=?, someId=? where bookId=?中的update语句显示了多个字段author=?, someId=?,似乎记录的语句并不适合您当前操作。

  • 在dao类中使用语句为session.update(book)创建新方法,并从updateSomeId方法调用相同的方法,并将book对象作为参数传递。