Pessoal,
estou tentando projetar a persistencia de uma app usando o padrão DAO, como explicado em http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html.
Mas não estou conseguindo entender as diferenças/semelhanças entre o objeto de negócio é o que ele chama de “objeto de transferência”. Esse seria, pelo que diz o artigo, o objeto que o DAO concreto usa para transferir dados da BD para a ram.
Aí eu pergunto: o hibernate não faz essa “transferencia” diretamente a partir do objeto de negócio? Eu realmente preciso implementar uma nova classe aqui, ou posso usar a própria classe de negócio?
E se precisar implementar, no que ela difere da classe de negócio?
Para exemplificar a minha dúvida, suponhamos uma classe forum simplificado assim:
public class ForumSimples
{
private String nome;
private ArrayList linhasDeDiscussao;
//gets & sets...
}
class LinhaDeDiscussao
{
private String assunto;
private ArrayList mensagens;
//...
}
class Mensagem
{
private String texto;
private Date dataDeCriacao;
private Usuario autor;
//....
}
Bem, até onde eu entendi, com os mapeamentos corretos, basta eu dar um sessao.saveOrUpdate(meuForum) no hibernate que ele grava tudo, inclusive as linhas e as mensagens, não é? O mesmo valendo na hora de recuperar, certo?
Então eu não consigo compreender a necessidade de ter uma outra classe, por exemplo, ForumSimplesTransfer. Pelo que vejo, bastaria o meu DAO referenciar o próprio objeto ForumSimples que solicitou a gravação. Ou não?
Aliás, mesmo que eu usasse jdbc puro para persisir os objetos, eu ainda não conseguiria ver utilidade para esse tal TransferObject… 
Alguém poderia me esclarecer?
Então o DTO só é necessário se a estrutura do objeto for muito grande, caso contrário, usa-se o próprio objeto como DTO.