não há a necessida de ser no método. vc pode anotar no atributo. eu particulamente prefiro no atributo.
F
Filipe_Chagas
Anotações podem ser feitas nos atributos ou nos métodos, as duas formas estão corretas.
Mas contrariamente ao autor do post que linquei, eu prefiro fazer nos atributos por dois motivos simples:
[list]Legibilidade[/list]Prefiro que tudo que for relacionado a ORM fique o mais reunido possível. Fora que ter um monte de anotações espalhadas entre os métodos de minha classe fica bem feio.
[list]Encapsulamento![/list]Nem todos os meus atributos possuem métodos get e set! Simples assim!
M
Mero_Aprendiz
Falha nossa!
Deveria ter escrito também pode ser ao invez de deve
Obviamente cada um tem seu metódo predileto de usar as anotações.
Eu pessoalmente utilizo em metódos GET apenas pelo costume que veio do XDoclet, nas versões anteriores ao uso de anotações.
[]'s
JL
A
andre2k2
Só exclarecendo:
Caso coloque a anotação no método Get, o JPA usará o metodo setter para atribuir o valor ao atributo.
Caso coloque a anotação no atributo, o JPA atribuirá o valor no atributo diretamente, via reflection.
Eu uso nos getters somente quando um dado precisa passar por algum tipo de tranformação antes de ser atribuido. É a minha forma de usar…
Mas lembre-se ou você usa todos nos atributos ou todos nos métodos, não pode misturar porque o JPA não gosta.
P
paulofernandesjr
bom como estou começando, você terãoq eu desculpar pelo tipo de pergunta… mas vamos lá
tenho a seguinte estrutura de tabelas
o código java fiz dessa forma
packagebr.com.ternet.cartao.bean;importjava.io.Serializable;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.ManyToOne;importjavax.persistence.Table;/** * Classe responsavel por representar um usuario no sistema * @author Paulo Fernandes * */@Entity@Table(name="usuario",schema="public")publicclassUsuarioBeanimplementsSerializable{privatestaticfinallongserialVersionUID=7918140502550519009L;@Id@GeneratedValue(strategy=GenerationType.SEQUENCE)@Column(name="cod_usuario")privateIntegercodigo;@Column(name="nome_usuario")privateStringnome;@Column(name="login")privateStringlogin;@Column(name="senha")privateStringsenha;@Column(name="status")privateIntegerstatus;@Column(name="tipo_usuario")privateIntegertipoUsuario;@ManyToOne(fetch=FetchType.LAZY)privateEquipeBeanequipe;// get and set removido para diminuir tamanho do post}----------------------------------------------------------------------------------packagebr.com.ternet.cartao.bean;importjava.io.Serializable;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.OneToMany;importjavax.persistence.Table;/** * classe responsavel por representar a equipe de vendas * @author Paulo Fernandes * */@Entity@Table(name="equipe",schema="public")publicclassEquipeBeanimplementsSerializable{privatestaticfinallongserialVersionUID=4157547012821652450L;@Id@GeneratedValue(strategy=GenerationType.SEQUENCE)@Column(name="cod_equipe")privateIntegercodEquipe;@Column(name="nome_equipe")privateStringnomeEquipe;@OneToMany(mappedBy="equipe",fetch=FetchType.LAZY)privateUsuarioBeanusuario;// get e set removido para diminuir tamanho do post}
isso que eu fiz está correto?
como posso fazer essa query??
/**
* metodo responsavel por retornar um usuario a partir do seu login
* @param login
* @return
*/
public UsuarioBean getUsuario(String login) {
UsuarioBean usuario = (UsuarioBean) entity.createQuery(????).getSingleResult();
// quero pegar o usuario a partir do login... como fazer???
return usuario;
}
PS:
esse é boa, ela tem vida própria…
hahah
A
andre2k2
Quase tem vida própria.
Só mais uma coisa:
Quando o nome do campo na tabela é igual ao nome do atributo na classe, você não precisa especificar usando a anotação @Column
Como aqui:
@Column(name="login")
private String login;
P
paulofernandesjr
beleza, valeu pela dica!
do resto esta tudo ok?
A
andre2k2
paulofernandesjr:
beleza, valeu pela dica!
do resto esta tudo ok?
Só rodando para saber… roda ai… grava coisas no banco, consulta… pelo que vi ta tudo OK!
Outra dica importante é esquecer de abrir a transaction, comitar e fechar a transaction… muita gente fica desesperado porque não grava na tabela quando só esqueceu de comitar a transação!
P
paulofernandesjr
como poderia fazer essa query aqui
/**
* metodo responsavel por retornar um usuario a partir do seu login
* @param login
* @return
*/
public UsuarioBean getUsuario(String login) {
UsuarioBean usuario = (UsuarioBean) entity.createQuery(????).getSingleResult();
// quero pegar o usuario a partir do login... como fazer???
return usuario;
}
num faço nem idéia de como fazer o select, tem algum tutorial?
Bom dia!
NoSuchMethodError quer dizer que um método esperado não foi encontrado na classe ClassWrite do jar da asm.
Troca a versão deste jar pra ver qual é.
Eu uso
Hibernate 3.2.1
cglib-2.1_3
asm-1.5.3
e asm-attrs-2.2
Good luck!
P
paulofernandesjr
Bruno Lacerda teria como você me mandar estes jar para que não tenha problema?
javax.servlet.ServletException: Provided id of the wrong type. Expected: class java.lang.Integer, got class java.lang.String
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
javax.servlet.ServletException: ERROR: syntax error at or near "equipe"
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
esse erro aqui é mais aceitavel pois a coluna que representa a equipe é null, que eu já resolvi
o problema agora é como fazer para buscar pelo campo login?
B
bsl.lacerda
Tem que montar uma query.
no método que eu havia te passado faz o seguinte:
publicUsuarioBeanread(Stringlogin){
Queryquery=entity.createQuery("from usuarioBean ub where ub.login = ?");query.setParameter(1,login);return(UsuarioBean)query.getResultList().get(0);
}
Não testei aqui, mas vou ver se consigo tb.
Testa aí…
P
paulofernandesjr
Bruno, deu quase certo, tive que apenas colocar o nome da classe me maiusculo
publicUsuarioBeanread(Stringlogin){Queryquery=entity.createQuery("from UsuarioBean ub where ub.login = ?"); query.setParameter(1,login); return(UsuarioBean)query.getResultList().get(0);
}
aproveitando o tópico, como posso fazer para selecionar um determinado campo da tabela???
B
bsl.lacerda
Funcionou?
Retornou um usuário pelo Login?
Bom, os campos das tabelas são as variáveis de instância dos seus beans (objetos do modelo).
Se você quiser selecionar um campo da tabela é a mesma coisa que fez antes. No caso você selecionou um UsuarioBean pelo campo Login da tabela.
Com o objeto retornado você agora tem acesso a todos os campos daquele registro (UsuarioBean) que o hibernate retornou para você.
P
paulofernandesjr
funcionou, deu certinho…
mas o que perguntei é o seguinte…
vamos supor que eu queira selecionar o nome da equipe que o usuario faz parta, você concorda que não precisarei do objeto usuario completo…
teria como retornar só o nome da equipe?
B
bsl.lacerda
Somente a String?
Não tem como, além do usuário, você vai ter que navegar até o objeto equipe e pegar este nome, ou seja, o nome da equipe ao qual o usuário encontrado pelo login faz parte.
Ex:
usuarioBean.getEquipe().getNome();
[]
P
paulofernandesjr
ah então beleza…
pensei que desse para fazer
select nome_equipe from usuario login = ?
mas beleza…
vou fazer mais alguns pontos do sistema
abraço e obrigado pelas dicas
P
paulofernandesjr
agora veio outra dúvida!
como o Hibernate sabe a sequencia que ele tem que pegar…
Cara, não tenho certeza mas eu acho que se você não especificar a sequência que ele terá que utilizar no banco, no caso uma sequência criada por você no banco de dados direto, ele vai gerar a sequência para poder gerar os ids da forma dele, o que não garante que a ordem de criação da sequência será gerada de 1 em 1. Entendeu?
Eu acho que é isso mas vamos aguardar outras opiniões do pessoal mais por dentro do assunto.