DAO com composição

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.

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,

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

Abs,

[quote=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?
[/quote]

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

Blz!! Brigadão!

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.

[quote=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,[/quote]

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

[]s

Por ter uma complexidade alta!

Abs,