package org.springframework.issues.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.issues.data.Book;
import org.springframework.issues.data.BookRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;
@Service
@Transactional
public class BookServiceImpl implements BookService {
@Autowired
private BookRepository books;
@Autowired
private BookServiceInternal booksInternal;
@Override
public void createBook(Book book) {
books.create(book);
}
@Override
@Transactional(propagation = Propagation.NEVER)
public void createBookWithoutTx(Book book) {
Book lookup = books.lookup(book.getId());
if (lookup != null) {
throw new IllegalArgumentException("Entity already exists " + book);
}
booksInternal.createAnotherBook(book);
}
@Override
public Book lookupBookById(long id) {
return books.lookup(id);
}
@Override
public void triggerCreatePostCommit(final Book book) {
// Lookup book to make sure we are using the enitity manager/repository
lookupBookById(book.getId());
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCompletion(int status) {
if (status == TransactionSynchronization.STATUS_COMMITTED) {
BookServiceHelper.getInstance().getBookService().createBookWithoutTx(book);
}
}
});
}
}