DAO com composição

7 respostas
C

No DAO, como eu lido com um objeto composto.
Q nem no meu caso. Eu tenho um cliente q possui n contas bancárias.

public class Cliente{
private List<ContaBancaria> contas;
}

E eu tenho uma classe ClienteDAO e outra ContaBancariaDAO.
Onde e quando eu vou construir as minhas contas bancarias?

Obs. A classe ContaBancária é CRUD.

7 Respostas

michelantunes

Cara,

Desse jeito, O ClienteDAO irá persistir o cliente do seguinte modo:
1- varrer a coleção de contas;
2- A cada conta, chamar o ContaBancariaDAO para persistir ContaBancaria.
3- Persistir o Cliente caso não tenha dado erro

O problema que não terá garantia de rollback da transação. Quando der erro na inserção da segunda ContaBancaria, a primeira já foi inserida com sucesso.

O correto seria usar a mesma transação para persistir o Cliente e a ContaBancaria.
Possíveis soluções:
A - Persistir tudo dentro do ClienteDAO, sem chamar o ContaBancariaDAO, e commitar ao final das operações.
B - Passar a conexão com o banco entre as classes ClienteDAO e ContaBancariaDAO (NÃO RECOMENDO).

Abs,

michelantunes

Ainda tem mais uma solução:
C - Usar JPA e anotar @OneToMany em sua classe ContaBancaria.

Abs,

sergiotaborda

carrijo:
No DAO, como eu lido com um objeto composto.
Q nem no meu caso. Eu tenho um cliente q possui n contas bancárias.

public class Cliente{
private List<ContaBancaria> contas;
}

E eu tenho uma classe ClienteDAO e outra ContaBancariaDAO.
Onde e quando eu vou construir as minhas contas bancarias?

Onde e quando vc quiser.
Se vc quer ter um campo com as contas o problema é todo seu.
Veja se isto não atende:

public class Cliente{

public  List<ContaBancaria> getContas(){
    ContaBancariaDAO dao = .. obtido de alguma forma
    return  dao.getContas(this);

}

Esta forma é especialmente melhor se não existir um addConta/removeConta

C

Blz!! Brigadão!

pcalcado

Se N é um número muito grande ou se trazer a conta é custoso use Lazy Loading. Se não, quando o objeto cliente for trazido do banco de dados já insira todos os dados dentro dele.

R

michelantunes:
Cara,

Desse jeito, O ClienteDAO irá persistir o cliente do seguinte modo:
1- varrer a coleção de contas;
2- A cada conta, chamar o ContaBancariaDAO para persistir ContaBancaria.
3- Persistir o Cliente caso não tenha dado erro

O problema que não terá garantia de rollback da transação. Quando der erro na inserção da segunda ContaBancaria, a primeira já foi inserida com sucesso.

O correto seria usar a mesma transação para persistir o Cliente e a ContaBancaria.
Possíveis soluções:
A - Persistir tudo dentro do ClienteDAO, sem chamar o ContaBancariaDAO, e commitar ao final das operações.
B - Passar a conexão com o banco entre as classes ClienteDAO e ContaBancariaDAO (NÃO RECOMENDO).

Abs,

só por curiosidade, pq voce nao recomenda a opção B?

[]s

michelantunes

Por ter uma complexidade alta!

Abs,

Criado 3 de setembro de 2008
Ultima resposta 9 de set. de 2008
Respostas 7
Participantes 5