[CONTINUAÇÃO]
Esse ai é o nosso DAO Genérico, certo? Ele faz uma série de coisas e também faz o log de grande parde do que está acontecendo… (Você usa log, certo? É muito mais fácil de ver o que está acontecendo com o seu programa, sem precisar debugar. Se não estiver, use o log4j, facinho de mexer e de entender)
Bom, agora eu vou criar um UFDAO e vou extender esse GenericDAO ai, pois o código está todo nele, certo?
@Component
public class UFDAO extends GenericDAO<UF> {
public UFDAO(Session session) {
super(session, UF.class); // Assim eu garanto que aqui só vai funcionar para UFs!
}
// Todos os outros métodos estão muito bem implementados. Simples não?
}
Mas temos um problema, a lista de UF já está pré-definida… Eu não acho que ela vá ficar mudando… Mas a gente está permitindo que ela mude… Isso é um problema… Precisamos nos livrar dos métodos save, saveOrUpdate, update e merge que vieram juntos na hora de extender…
Muita gente “resolvia” esse problema dessa forma:
@Component
public class UFDAO extends GenericDAO<UF> {
public UFDAO(Session session) {
super(session, UF.class);
}
@Override
public void save(UF obj) {
throw new RuntimeException("Você não pode salvar uma UF.");
}
@Override
public void saveOrUpdate(UF obj) {
throw new RuntimeException("Você não pode salvar ou alterar uma UF.");
}
@Override
public void merge(UF obj) {
throw new RuntimeException("Você não pode alterar uma UF.");
}
@Override
public void update(UF obj) {
throw new RuntimeException("Você não pode alterar uma UF.");
}
}
Cá entre nós, você está disponibilizando um método e, quando alguém chama, ele dá pau.
Isso ai é uma herança preguiçosa. Coisa horrível de ser feita, pois você herda TUDO da classe pai.
Então, vamos à composição:
@Component
public class UFDAO {
private GenericDAO<UF> genericDAO;
// Se você estiver usando eclipse, ele te ajuda nessa tarefa de pegar
// somente os métodos que você quer...
// Basta você criar o field da classe que você quer importar os métodos,
// clicar com o botão direito,
// Selecionar a opção 'Source' e depois 'Generate Delegate Methods...'
// Ai vai abrir uma caixinha para você selecionar os métodos que você quer.
// Veja a mágica acontecendo.
public UFDAO(Session session) {
genericDAO = new GenericDAO<UF>(session, UF.class);
}
// Agora só tem os métodos que a gente quiser.
public UF get(Long id) { // Troquei para Long pois faz mais sentido aqui.
// Lá no GenericDAO, é bom deixar Serializable, pois você pode fazer
// alguma PK com char.
// Que é o caso de País, ou UF mesmo
return genericDAO.get(id);
}
public List<UF> list() {
return genericDAO.list();
}
public List<UF> list(Order order) {
return genericDAO.list(order);
}
public List<UF> list(String term, MatchMode matchMode) {
return genericDAO.list(term, matchMode);
}
}
Assim, a gente consegue receber um UFDAO tranquilamente e só passar ao método get o que realmente interessa, o ID da UF.
Assim, ainda evitamos a redundância, menor chances de erros e muito mais:
antes:
UF uf = ufDao.carrega(UF.class, 2);
agora:
De nada cara! Só desejo que procure sempre melhorar, em qualquer coisa!