Estou usando JDBC em um sistema com banco legado (em um sistema comercial Delphi)
(ja usei hibernate mas o mapeamento não foi muito trivial para este banco)
por isso usar JDBC seria a melhor saida.
Mas gostaria de saber vocês pupulam o objecto modelo;
com set um por um ?
Cliente cliente = new Cliente();
cliente.setCD_CLIENTE(rs.getString("CD_CLIENTE"));
cliente.setNM_CLIENTE(rs.getString("NM_CLIENTE"));
// ....
ja que esta tabela por exemplo tem 83 fileds e todo provavelmente serão usados…
é algo que consome algum tempo para fazer as operações dos daos
Você pode tentar criar uma solução utilizando Reflexão. Assim você identificaria a classe, criaria uma instância desta, identificaria os métodos a serem invocados e popularia o objeto com base no ResultSet. Acho que isso resolveria o seu problema, se é que eu entendi corretamente.
[quote=maniacs]Vou dar uma olhada…
estava penssando em usar reflection para populalos dinamicamente…[/quote]
Se seus objetos de modelos são espelhos identicos das tabelas do banco de dados, você poderia usar reflection tranquilamente, ainda mais que você tem deixado o nome dos atributos na mesma convenção do banco.
O problema é se você tiver por exemplo, uma classe(leia objeto) que é persistida em varias tabelas ou varias tabelas que são carregadas em um unico objeto. Ai a coisa complica.
Em todo caso você ja tentou usar algum gerador de DAO? Acho que seria bom para seu caso
[quote=ddduran][quote=maniacs]Vou dar uma olhada…
estava penssando em usar reflection para populalos dinamicamente…[/quote]
Se seus objetos de modelos são espelhos identicos das tabelas do banco de dados, você poderia usar reflection tranquilamente, ainda mais que você tem deixado o nome dos atributos na mesma convenção do banco.
O problema é se você tiver por exemplo, uma classe(leia objeto) que é persistida em varias tabelas ou varias tabelas que são carregadas em um unico objeto. Ai a coisa complica.
Em todo caso você ja tentou usar algum gerador de DAO? Acho que seria bom para seu caso[/quote]
Gerador de dao ?
sim classe mapeada / tabela no banco são mesmos nomes de fields…
[quote=maniacs]Estou usando JDBC em um sistema com banco legado (em um sistema comercial Delphi)
(ja usei hibernate mas o mapeamento não foi muito trivial para este banco)
[/quote]
O que faltou? Se fosse vc insistiria com Hibernate. Vc apanha um pouco no começo, mas depois é só correr pro abraço.
É que ja fiz uma implementação no hibernate para um modelo parecido de banco de dados (outro sistema da empresa) e foi realmente trabalhoso o mapeamento
mas os DAOS foram faceis, ja que usei um GenericDAO no hibernate que fazia praticamante tudo que eu precisava…
mas ainda assim o Mapeamento era trabalhoso ja que uma unica tabela tinha mais de 100 fields e varios relacionamentos
pior que o banco é bem modelado, mas o sistema é complexo e o mapeamento é grande…
[quote=maniacs]Estou usando JDBC em um sistema com banco legado (em um sistema comercial Delphi)
(ja usei hibernate mas o mapeamento não foi muito trivial para este banco)
por isso usar JDBC seria a melhor saida.[/quote]
Só porque você ainda não aprendeu a usar ? :roll:
[quote=maniacs]Mas gostaria de saber vocês pupulam o objecto modelo;
com set um por um ?[/quote]
Sem uma ferramenta de ORM vai ter que setar um por um ou reinventar a roda fazendo reflection. :lol:
[quote=maniacs]ja que esta tabela por exemplo tem 83 fileds e todo provavelmente serão usados…
é algo que consome algum tempo para fazer as operações dos daos[/quote]
Consome tempo porque você não quer aprender a utilizar o Hibernate. O tempo que vai perder fazendo essas coias nesse projeto que você está já vale aprender o Hibernate. Vai ganhar bastante tempo depois
Não é o meu conhecimento sobre hibernate que me limita, ja que eu o uso em outros tantos sistemas sem problemas
no meu ver o hibernate em casos como esse, com banco legado não é prodututivo e acaba complicando o desenvolvimento
por isso ainda estou convencido que JDBC é a melhor solução para este caso
“Consome tempo porque você não quer aprender a utilizar o Hibernate. O tempo que vai perder fazendo essas coias nesse projeto que você está já vale aprender o Hibernate”
[quote=maniacs]Estou usando JDBC em um sistema com banco legado (em um sistema comercial Delphi)
(ja usei hibernate mas o mapeamento não foi muito trivial para este banco)
por isso usar JDBC seria a melhor saida.
Mas gostaria de saber vocês pupulam o objecto modelo;
com set um por um ?
Cliente cliente = new Cliente();
cliente.setCD_CLIENTE(rs.getString("CD_CLIENTE"));
cliente.setNM_CLIENTE(rs.getString("NM_CLIENTE"));
// ....
[/quote]
Se os seus objetos cumprem essa regra de que o nome da coluna é igual ao nome da propriedade
ou seja setXYZ seta a coluna XYZ vc pose usar reflection.
public void populate(Object objectoAPopular, ResultSet rs){
//obtém todos os métodos da classe
Method[] methods = objectoAPopular.getClass().getDeclaredMethods();
//itera todos. e aqueles que começam com set invoca
for (int i = 0 ; i < methods.length; i++){
Method m = methods[i];
if (m.getName().startsWith("set")){
//obtem o resto do nome
final String coluna = m.getName().subString(4).toUpperCase(); // tudo depois de set
final Class tipoDeDado = m.getParameterTypes()[0]; // só tem um parametro
m.invoke( objectoAPopular , readFromResult(coluna, tipoDeDado);
}
}
}
private Object[] readFromResult(String coluna, Class tipo){
// aqui existem outras formas só para dar uma ideia
if (tipo.equals(String.class)){
return new Object[]{rs.getString(coluna)};
} else if (tipo.equals(Integer.class)){
return new Object[]{rs.getInt(coluna)};
} // etc...
}
Se os nomes das colunas são são exactamente iguais aos dos métodos, pode incluir um mapeamento simples num arquivo properties, por exemplo.
tem scripts que geram automaticamente o mapeamento e a classe persistente… não lembro de cabeça o nome mas isto pode lhe ajudar… dai não precisa gerar os mapeamentos na mão… apenas colocar o hbm no hibernateconfig…
É que ja fiz uma implementação no hibernate para um modelo parecido de banco de dados (outro sistema da empresa) e foi realmente trabalhoso o mapeamento
mas os DAOS foram faceis, ja que usei um GenericDAO no hibernate que fazia praticamante tudo que eu precisava…
mas ainda assim o Mapeamento era trabalhoso ja que uma unica tabela tinha mais de 100 fields e varios relacionamentos
pior que o banco é bem modelado, mas o sistema é complexo e o mapeamento é grande…[/quote]
As suas classes tambem possuem +/- 100 atributos ?? :shock:
É que ja fiz uma implementação no hibernate para um modelo parecido de banco de dados (outro sistema da empresa) e foi realmente trabalhoso o mapeamento
mas os DAOS foram faceis, ja que usei um GenericDAO no hibernate que fazia praticamante tudo que eu precisava…
mas ainda assim o Mapeamento era trabalhoso ja que uma unica tabela tinha mais de 100 fields e varios relacionamentos
pior que o banco é bem modelado, mas o sistema é complexo e o mapeamento é grande…[/quote]
As suas classes tambem possuem +/- 100 atributos ?? :shock: [/quote]
Em alguns casos como Cliente sim, depende a tabela mapeada, ja que os dados controlados pelo sistema são muitos obrigatorios
[quote=maniacs]no meu ver o hibernate em casos como esse, com banco legado não é prodututivo e acaba complicando o desenvolvimento
por isso ainda estou convencido que JDBC é a melhor solução para este caso[/quote]
Já considerou o uso de IBatis ? Poderia se uma alternativa interessante. Pelo menos ficar dando setXXX toda hora não vai precisar. O fato é que JDBC na unha somente em casos extremos. Não acho que seja o seu.