каждый!Конфигурация: 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: транзакция не выполняется