Pessoal, na minha aplicação tenho um pacote chamado repositório, com classe separada para cada classe do pacote modelo, gostaria de saber com fazer para tornar os métodos todos genérico usando apenas um DAO para todas as classe do pacote modelo, um DAO genérico consigo fazer o problema é transformar esse métodos específicos que tenho em métodos genéricos. estou colocando um exemplo da umas das classe do meu repositório, esse métodos são comuns para todos as classe do pacote repositório.
public class RepositorioUsuario implements IRepositorioUsuario {
Session sessao = null;
Transaction tx = null;
public void salvarUsuario(Usuario a) {
sessao = HibernateUtil.getSession();
try {
tx = sessao.beginTransaction();
if (procurar(a.getLogin()) == null) {
sessao.save(a);
tx.commit();
JOptionPane.showMessageDialog(null,
"Usuário salvo com sucesso!");
} else {
JOptionPane
.showMessageDialog(null,
"Usuário não pode ser cadastrato, verifique se o usuário já existente!");
}
} catch (Exception e) {
e.printStackTrace();
}
sessao.close();
}
public void removerUsuario(long id) {
try {
sessao = HibernateUtil.currentSession();
tx = sessao.beginTransaction();
Query selecao = sessao
.createQuery("FROM Usuario WHERE id =:idUsuario");
selecao.setLong("idUsuario", id);
Usuario a = (Usuario) selecao.uniqueResult();
if (a != null) {
// CODIGO PARA JOPTIONPANE APARECER SIM OU NÃ?O
String[] opcoes = { "Sim", "Nao" };
int n = JOptionPane.showOptionDialog(null,
"Deseja remover Usuario?", " ",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, opcoes, opcoes[0]);
if (n == 0) {
sessao.delete(a);
tx.commit();
}
}
} catch (Exception e) {
e.printStackTrace();
}
sessao.close();
}
public void atualizarUsuario(long id) {
sessao = HibernateUtil.currentSession();
try {
tx = sessao.beginTransaction();
Query selecao = sessao
.createQuery("FROM Usuario WHERE id =:idUsuario");
selecao.setLong("idUsuario", id);
Usuario a = (Usuario) selecao.uniqueResult();
if (a != null) {
// CODIGO PARA JOPTIONPANE APARECER SIM OU NÃ?O
String[] opcoes = { "Sim", "Nao" };
int n = JOptionPane.showOptionDialog(null,
"Deseja Aleterar Usuário?", " ",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, opcoes, opcoes[0]);
if (n == 0) {
sessao.update(a);
tx.commit();
}
sessao.close();
}
} catch (Exception e) {
e.printStackTrace();
}
sessao.close();
}
private Usuario procurar(String login) {
Query selecao = sessao.createQuery("FROM Usuario WHERE login =:LoginUsuario");
selecao.setString("LoginUsuario", login);
Usuario a = (Usuario) selecao.uniqueResult();
return a;
}
public Usuario procurarFuncaco(String login) {
sessao = HibernateUtil.getSession();
tx = sessao.beginTransaction();
Query selecao = sessao.createQuery("FROM Usuario WHERE login =:LoginUsuario");
selecao.setString("LoginUsuario", login);
Usuario a = (Usuario) selecao.uniqueResult();
return a;
}
public boolean procurarPeloNomeeSenha(String login, String senha) {
sessao = HibernateUtil.getSession();
tx = sessao.beginTransaction();
Criteria c = sessao.createCriteria(Usuario.class);
Criterion _login = Restrictions.eq("login", login);
c.add(_login);
Criterion _senha = Restrictions.eq("senha", senha);
c.add(_senha);
return c.uniqueResult() != null;
}
@SuppressWarnings("unchecked")
public List<Usuario> listarTodosUsuarios() {
sessao = HibernateUtil.currentSession();
tx = sessao.beginTransaction();
List<Usuario> la = null;
Criteria todos = sessao.createCriteria(Usuario.class);
la = todos.list();
if (la == null) {
JOptionPane.showMessageDialog(null, "Nenhum registro encontrado!");
}
sessao.close();
return la;
}
@SuppressWarnings("unchecked")
public List<Usuario> listarUsuarioLikeNome(String texto) {
sessao = HibernateUtil.currentSession();
tx = sessao.beginTransaction();
Criteria criteira = sessao.createCriteria(Usuario.class).add(
Restrictions.ilike("nome", "texto%"));
List<Usuario> resultados = criteira.list();
if (resultados == null) {
JOptionPane.showMessageDialog(null, "Nenhum registro encontrado!");
}
sessao.close();
return resultados;
}
}
Fico no aguardo da ajuda de vocês,
Cara vc terá que usar Generics e ao invés de passar um objeto fixo tipo Usuario u vc passa Object o ou quando for usar Usuario.class vc passa Class<?> c
Assim vc deixa seu método generico podendo passar qualquer outra classe como parametro.
Deu pra entender?
diogo soares então ficaria assim??
public class RepositorioUsuario implements IRepositorioUsuario {
Session sessao = null;
Transaction tx = null;
public void salvarUsuario(Object a) {
sessao = HibernateUtil.getSession();
try {
tx = sessao.beginTransaction();
if (procurar(a.getLogin()) == null) {
sessao.save(a);
tx.commit();
JOptionPane.showMessageDialog(null,
"Usuário salvo com sucesso!");
} else {
JOptionPane
.showMessageDialog(null,
"Usuário não pode ser cadastrato, verifique se o usuário já existente!");
}
} catch (Exception e) {
e.printStackTrace();
}
sessao.close();
}
public void removerUsuario(long id) {
try {
sessao = HibernateUtil.currentSession();
tx = sessao.beginTransaction();
Query selecao = sessao
.createQuery("FROM Usuario WHERE id =:idUsuario");//Cara mas nesse trecho SQL, como ficarai??
selecao.setLong("idUsuario", id);
Object a = (Object) selecao.uniqueResult();
if (a != null) {
// CODIGO PARA JOPTIONPANE APARECER SIM OU NÃ?O
String[] opcoes = { "Sim", "Nao" };
int n = JOptionPane.showOptionDialog(null,
"Deseja remover Usuario?", " ",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, opcoes, opcoes[0]);
if (n == 0) {
sessao.delete(a);
tx.commit();
}
}
} catch (Exception e) {
e.printStackTrace();
}
sessao.close();
}
public void atualizarUsuario(long id) {
sessao = HibernateUtil.currentSession();
try {
tx = sessao.beginTransaction();
Query selecao = sessao
.createQuery("FROM Usuario WHERE id =:idUsuario");//Cara mas nesse trecho SQL, como ficarai??
selecao.setLong("idUsuario", id);
Object a = (Object) selecao.uniqueResult();
if (a != null) {
// CODIGO PARA JOPTIONPANE APARECER SIM OU NÃ?O
String[] opcoes = { "Sim", "Nao" };
int n = JOptionPane.showOptionDialog(null,
"Deseja Aleterar Usuário?", " ",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, opcoes, opcoes[0]);
if (n == 0) {
sessao.update(a);
tx.commit();
}
sessao.close();
}
} catch (Exception e) {
e.printStackTrace();
}
sessao.close();
}
private Object procurar(String login) {
Query selecao = sessao.createQuery("FROM Usuario WHERE login =:LoginUsuario"); //Cara mas nesse trecho SQL, como ficarai??
selecao.setString("LoginUsuario", login);
Object a = (Object) selecao.uniqueResult();
return a;
}
public Object procurarFuncaco(String login) {
sessao = HibernateUtil.getSession();
tx = sessao.beginTransaction();
Query selecao = sessao.createQuery("FROM Usuario WHERE login =:LoginUsuario");//Cara mas nesse trecho SQL, como ficarai??
selecao.setString("LoginUsuario", login);
Object a = (Object) selecao.uniqueResult();
return a;
}
public boolean procurarPeloNomeeSenha(String login, String senha) {
sessao = HibernateUtil.getSession();
tx = sessao.beginTransaction();
Criteria c = sessao.createCriteria(Class<?> c);
Criterion _login = Restrictions.eq("login", login);
c.add(_login);
Criterion _senha = Restrictions.eq("senha", senha);
c.add(_senha);
return c.uniqueResult() != null;
}
@SuppressWarnings("unchecked")
public List<T> listarTodosUsuarios() {
sessao = HibernateUtil.currentSession();
tx = sessao.beginTransaction();
List<T> la = null;
Criteria todos = sessao.createCriteria(Class<?> a);
la = todos.list();
if (la == null) {
JOptionPane.showMessageDialog(null, "Nenhum registro encontrado!");
}
sessao.close();
return la;
}
@SuppressWarnings("unchecked")
public List<T> listarUsuarioLikeNome(String texto) {
sessao = HibernateUtil.currentSession();
tx = sessao.beginTransaction();
Criteria criteira = sessao.createCriteria(Class<?> a).add(
Restrictions.ilike("nome", "texto%"));
List<T> resultados = criteira.list();
if (resultados == null) {
JOptionPane.showMessageDialog(null, "Nenhum registro encontrado!");
}
sessao.close();
return resultados;
}
}
mas ficou ainda uma dúvida:
(“FROM Usuario WHERE login =:LoginUsuario”);
Login = variável criada local
loginUsuario = Campo na tabela
Cara mas nesse trecho SQL, como ficaria??
Bom nesse caso seria um lance especifico da sua aplicação onde vc precisa realmente que seja Usuario não seria um caso onde vc pode passar qualquer coisa, o que pode ser feito nesse caso se vc realmente quiser que fique generico, seria deixar no como parametro no método tipo:
private Object procurar(String parametro, String tabela, String coluna) {
Query selecao = sessao.createQuery("FROM "+tabela+" WHERE "+coluna+" =:par1");
selecao.setString("par1", parametro);
Object a = (Object) selecao.uniqueResult();
return a;
}
Seria algo desse tipo, não estou te dizendo para fazer assim, mais seria uma alternativa.
O que pode ser feito para ficar mais elegante, seria vc ter um DAO generico e o que não for generico vc pode criar um DAO especifico para sua classe chamadora.
Você pode também usar reflections, assim irá diminuir a quantidade de parâmetros, e vc pode usar annotations para o atributo e passar apenas o “parâmetro por parâmetro” ^^.
Como o amigo ai disse, procure por DAO genérico, e quando precisar de algo específico, ai você cria o método específico.
Galera entende, mas com fazer um método generico de salvar que não permita nome do usuário duplicado exemplo:
public void salvarUsuario(Usuario a) {
sessao = HibernateUtil.getSession();
try {
tx = sessao.beginTransaction();
if (procurar(a.getLogin()) == null) {
sessao.save(a);
tx.commit();
JOptionPane.showMessageDialog(null,
"Usuário salvo com sucesso!");
} else {
JOptionPane
.showMessageDialog(null,
"Usuário não pode ser cadastrato, verifique se o usuário já existente!");
}
} catch (Exception e) {
e.printStackTrace();
}
sessao.close();
}
private Usuario procurar(String login) {
Query selecao = sessao.createQuery("FROM Usuario WHERE login =:LoginUsuario");
selecao.setString("LoginUsuario", login);
Usuario a = (Usuario) selecao.uniqueResult();
return a;
}
O método salvar estar usando o método procurar, para fazer uma pesquisa antes de salvar,
assim se já existir um usuário com o mesmo nome ele não permite salvar, com faria isso ser
genérico.
e com fazer um listar laike generico com esse:
[code]
public List listarUsuarioLikeNome(String texto) {
sessao = HibernateUtil.currentSession();
tx = sessao.beginTransaction();
Criteria criteira = sessao.createCriteria(Usuario.class).add(
Restrictions.ilike("nome", "texto%"));
List<Usuario> resultados = criteira.list();
if (resultados == null) {
JOptionPane.showMessageDialog(null, "Nenhum registro encontrado!");
}
sessao.close();
return resultados;
}[/code]