Pessoal, estou desenvolvendo um sistema que pela regra de negócio, um cliente pode ter um ou dois enderecos (endereço de serviço e endereço de cobrança), um ou mais telefones e um ou mais animais de estimação. Assim, eu criei uma classe bean para cada uma dessas entidades além é claro um para as classes de ligação Enderecamento que liga o cliente aos endereços e ContatoTelefonico que liga o cliente aos telefones. Além disso, da mesma forma criei uma classe DAO para cada ume dessas entidades e das classes de ligação. Assim, por exemplo, na classe Telefone no pacote DAO tenho um método para cada função CRUD, ou seja, um de inserção, um de atualização, um de exclusão e um de pesquisa.
No botão salvar eu chamo cada um dos métodos dao responsável por persistir as entidades no banco, na seguinte ordem:
idCliente = dao.Cliente.inserir(retornarCliente());
codigosTelefones = dao.Telefone.inserir(telefonesAdcionados);
codigosEnderecos = dao.Endereco.inserir(retornarLocal());
dao.ContatoTelefonico.inserir(retornarContatoTelefonico());
dao.Enderecamento.inserir(retornarEnderecamento());
codigosAnimais = dao.Animal.inserir(retornarListaAnimais());
O problema é que eu desejo que todos esses métodos participem de uma mesma transação de modo que, caso haja algum problema de inserção não haja o commit, mas sim ou rollback. Tudo está funcionando, mas eu receio por travamentos do BD, etc. Como fazer que todos esses métodos sejam tratados de forma atômica, ou sej colocados em uma única transação do JDBC? Fazer uma classe gigante não parece uma boa ideia. Eu consigo trabalhar com transações em nível de classe (em cada dao), mas não entre diferentes classes. As tentivas que fiz dão erro de fk, como por exemplo executo o PreparedStatement do Cliente, mas não dou commit, daí a classe ContatoTelefonico dá erro de fk para Cliente.
Exemplo (fragmento de dao.Telefone):
public class Telefone {
private static final int CAMPO_PK = 1;
public static List<Integer> inserir(List<bean.Telefone> telefones)
throws SQLException{
List<Integer> codigos = new ArrayList<>();
try(Connection conectaBancoDeDados = ConectaBancoDeDados.getConexao()){
String stringSQLInsercao = "INSERT INTO Telefones(tipo_telefone, "
+ "numero_telefone, operadora, principal) "
+ "VALUES(?, ?, ?, ?)";
conectaBancoDeDados.setAutoCommit(false);
try(PreparedStatement pstmt = conectaBancoDeDados
.prepareStatement(stringSQLInsercao,
PreparedStatement.RETURN_GENERATED_KEYS)){
for(bean.Telefone telefone : telefones){
pstmt.setString(1, telefone.getTipoTelefone());
pstmt.setString(2, telefone.getNumeroTelefone());
pstmt.setInt(3, telefone.getOperadora());
pstmt.setInt(4, telefone.getPrincipal());
pstmt.addBatch();
}
pstmt.executeBatch();
conectaBancoDeDados.commit();
try(ResultSet rstSet = pstmt.getGeneratedKeys()){
while(rstSet.next()){
codigos.add(rstSet.getInt(1));
}
rstSet.close();
}
pstmt.close();
}
conectaBancoDeDados.setAutoCommit(true);
conectaBancoDeDados.close();
}
return codigos;
}
Como resolver?
Desde já agradeço.