Minha sugestão é que você pense ± assim;
[code]
public class Cliente{
private Long id;
private String nome;
private String endereco;
private String telefone;
public void save() throws NegocioException {
/* Executa alguma regra de negócio. Por exemplo o cliente não pode ter um telefone com DDD de fora do Rio de Janeiro.
* Caso o telefone informado não seja do Rio, lança uma NegocioException informando que o telefone não é do Rio.
*/
...
try{
//Abre uma conexão e inicia a transação...
...
//Cria o dao e passa a conexão, aberta anteriormente, para ele. Estou assumindo que você não está usando uma DAOFactory.
ClienteDAO dao = new JdbcClienteDAO(conn);
//Manda o dao salvar o objeto cliente
dao.save(this);
//Commita a transação.
...
}catch (DAOException e){
//Dá rollback na transação e lança uma Exception que caracterize erro no sistema.
...
}finally{
//Fecha a conexão
}
}
//Getters e Setters.
}[/code]
E no DAO:
[code]public class JdbcClienteDAO implements ClienteDAO {
private final Connection conn;
/**
* Receber a Connection para que eu possa usar os métodos do DAO em mais de um lugar, sem que ele atrapalhe uma transação.
*/
public JpaClienteDAO(Connection conn) {
this.conn = conn;
}
public int save(Cliente cliente){
//Código para inserir um cliente no banco de dados usando a Connection recebida no Construtor.
}
}[/code]
Assim você poderá usar o método save do JdbcClienteDAO em outra classe, que não a que você pensou originalmente: Cliente.
Qual a vantagem disso?
Simples, em uma situação em que o método save esteja em uma transação maior do que salvar um Cliente.
Um exemplo?
Imagina o método creditar e debitar. Criados na classe ContaCorrente de um sistema para um Banco.
No método creditar você informa o valor e é feito um crédito na ContaCorrente com o valor informado.
No método debitar você informa o valor e é feito um débito na ContaCorrente com o valor informado.
Usando minha sugestão, o método transferirPara(ContaCorrente cc, BigDecimal valor) será uma chamada aos dois métodos, só que em uma transação sendo iniciada antes do primeiro e sendo commitada depois do segundo.
[code]transferirPara(ContaCorrente cc, BigDecimal valor){
try{
//Abre uma conexão e inicia a transação…
…
//Cria o dao e passa a conexão, aberta anteriormente, para ele. Estou assumindo que você não está usando uma DAOFactory.
ContaCorrenteDAO dao = new JdbcContaCorrenteDAO(conn);
//Creditar na atual
dao.creditar(this, valor);
//Debitar da CC informada
dao.debitar(cc, valor);
//Commita a transação.
...
}catch (DAOException e){
//Dá rollback na transação e lança uma Exception que caracterize erro no sistema.
...
}finally{
//Fecha a conexão
}
}[/code]