Oi!
Após eu fazer os ajustes na minha aplicação, percebi que executa corretamente somente quando eu vou criar uma transação, fazendo todos os cálculos necessários, pela forma_pagamento desejada. O problema está ocorrendo quando eu tento criar uma nova transação, retornando o erro abaixo:
Error: could not execute statement [Referential integrity constraint violation: "FK_TRANSACOES_CONTAS_ID: PUBLIC.TRANSACOES FOREIGN KEY(ID) REFERENCES PUBLIC.CONTAS(ID) (CAST(2 AS BIGINT))"; SQL statement: insert into transacoes (forma_pagamento,numero_conta,saldo,valor,id) values (?,?,?,?,default) [23506-220]] [insert into transacoes (forma_pagamento,numero_conta,saldo,valor,id) values (?,?,?,?,default)]; SQL [insert into transacoes (forma_pagamento,numero_conta,saldo,valor,id) values (?,?,?,?,default)]; constraint [FK_TRANSACOES_CONTAS_ID]
Pergunta. Esse problema acontece por influência do tipo de relacionamento que apliquei na classe de entidade (Transaction)? Vou passar como estão as classes de entidade que criei, pois eu coloquei o relacionamento 1 para 1 (@OneToOne). Poderiam ajudar, por favor?
@Table(name = "contas")
@Entity(name = "Account")
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Account {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String numero_conta;
private Double saldo;
private Boolean ativo;
public Account(DataRegistrationAccount data){
this.numero_conta = data.numero_conta();
this.saldo = data.saldo();
this.ativo = true;
}
public Account(DataDetailingAccount data){
this.numero_conta = data.numero_conta();
this.saldo = data.saldo();
}
public void deleteOrInvalidateInformations(){
this.ativo = false;
}
}
@Table(name = "transacoes")
@Entity(name = "Transaction")
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Transaction {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
private PaymentForm forma_pagamento;
private String numero_conta;
private Double valor;
private Double saldo;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id")
private Account account;
public Transaction(DataRegistrationTransaction data) {
this.forma_pagamento = data.forma_pagamento();
this.numero_conta = data.numero_conta();
this.valor = data.valor();
}
public Transaction(DataDetailingAccount data) {
this.numero_conta = data.numero_conta();
this.saldo = data.saldo();
}
}
Classe onde eu coloquei todas as regras de negócio (service):
@Service
@Transactional
@RequiredArgsConstructor
public class TransactionService {
@Autowired
private AccountRepository accountRepository;
@Autowired
private TransactionRepository transactionRepository;
public DataDetailingTransaction saveTransaction(Transaction transactions) {
if (transactions.getNumero_conta() == null) {
throw new ValidationException("Conta não cadastrada na base de dados.");
}
Optional<Transaction> optTransaction = Optional.ofNullable(transactionRepository.findTransactionByAtivoTrue(transactions.getNumero_conta()));
var valorCalculado = computeTaxTransaction(transactions);
Optional<Account> optAccount = Optional.ofNullable(accountRepository.findAccountByAtivoTrue(transactions.getNumero_conta()));
double saldoInicial = 0.0;
saldoInicial = optAccount.get().getSaldo();
double saldo = 0.0;
saldo = saldoInicial - valorCalculado;
var account = new Account(optAccount.get().getId(), transactions.getNumero_conta(), saldo, true);
accountRepository.save(account);
Transaction saveTransaction;
var transaction = new Transaction(transactions.getId(), transactions.getForma_pagamento(), transactions.getNumero_conta(), transactions.getValor(), saldo, account);
saveTransaction = transactionRepository.save(transaction);
return new DataDetailingTransaction(saveTransaction);
}
private double computeTaxTransaction(Transaction transactions) {
if (transactions.getForma_pagamento() == null) {
throw new ValidationException("É obrigatório informar a forma de pagamento para validar o processo de transação.");
}
double taxTransaction = 0.0;
PaymentForm paymentForm = transactions.getForma_pagamento();
taxTransaction = paymentForm.computeTaxTransaction(transactions.getValor());
return taxTransaction;
}
}