SpringBoot @RestController более одного метода @Transactional - PullRequest
0 голосов
/ 16 ноября 2018

каждый!Конфигурация: 1. Spring Boot: Web, JPA, H2

Приложение:

@SpringBootApplication
public class BankApplication {

public static void main(String[] args) {
    SpringApplication.run(BankApplication.class, args);
}

}

BankAccountDaoImpl:

@Repository
public class BankAccountDaoImpl implements BankAccountDao {

@Autowired
private EntityManagerFactory entityManagerFactory;

@Override
public void saveBankAccount(BankAccount bankAccount) {
    Session currentSession = entityManagerFactory.unwrap(SessionFactory.class).openSession();

    currentSession.save(bankAccount);
}

@Override
public BankAccount getBankAccount(int id) {
    Session currentSession = entityManagerFactory.unwrap(SessionFactory.class).openSession();

    BankAccount bankAccount = currentSession.get(BankAccount.class, id);

    return bankAccount;
}
}

ClientAccountDaoImp:

@Repository
public class ClientAccountDaoImp implements ClientAccountDao{

@Autowired
private EntityManagerFactory entityManagerFactory;

@Override
public void saveClientAccount(ClientAccount clientAccount) {
    Session currentSession = entityManagerFactory.unwrap(SessionFactory.class).openSession();

    currentSession.saveOrUpdate(clientAccount);
}

@Override
public ClientAccount getClientAccount(int id) {
    Session currentSession = entityManagerFactory.unwrap(SessionFactory.class).openSession();

    return currentSession.get(ClientAccount.class, id);
}

BankAccountServiceImpl и ClientAccountServiceImpl: aitowired BankAccountDaoImpl и ClientAccountDaoImp ​​

Все методы имеют аннотацию @Transactional:

@Override
@Transactional
public void saveClientAccount(ClientAccount clientAccount) {
    clientAccountDao.saveClientAccount(clientAccount);
}

@Override
@Transactional
public ClientAccount getClientAccount(int id) {
    return clientAccountDao.getClientAccount(id);
}

У меня есть @RestController:

   @GetMapping("/buy/{accountId}/sum/{money}")
   public ClientAccount chargeAccount(@PathVariable int accountId, 
   @PathVariable int money) {

    BankAccount bankAccount = bankAccountService.getBankAccount(1);
    int mn = bankAccount.getAmount() - money;
    bankAccount.setAmount(mn);
    bankAccountService.saveBankAccount(bankAccount);
    ClientAccount clientAccount = clientAccountService.getClientAccount(accountId);
    clientAccount.setAmount(money);

    clientAccountService.saveClientAccount(clientAccount);

    return clientAccount;
}
Метод 101 * *1018* **;У меня есть исключение:

org.hibernate.HibernateException: незаконная попытка связать прокси [com.sustavov.bank.entity.Client # 1] с двумя открытыми сессиями

Если в классе Дао я делаю getCurrentSession(), кроме openSession().У меня ошибка:

javax.persistence.TransactionRequiredException: транзакция не выполняется

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