简而言之,我有三种方法:
@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
答案 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=?
,似乎记录的语句并不适合您当前操作。
session.update(book)
创建新方法,并从updateSomeId
方法调用相同的方法,并将book
对象作为参数传递。