opa!
galera gostaria que algum me explicasse o seguinte.
onde devo colocar as anotações dos campos
assim esta correto, tem que ser antes do Get mesmo?
@Id
@Column(name = "cod_cliente", unique = true, nullable = false, precision = 10, scale = 0)
public Integer getCodCliente() {
return this.codCliente;
}
ou tem que ser diferente?
como posso fazer para selecionar o proximo valor de uma sequence?
obrigado
ou devo fazer assim
@Id
private Integer codUsuario;
qual é a forma correta?
[quote=paulofernandesjr]opa!
galera gostaria que algum me explicasse o seguinte.
onde devo colocar as anotações dos campos
assim esta correto, tem que ser antes do Get mesmo?
@Id
@Column(name = "cod_cliente", unique = true, nullable = false, precision = 10, scale = 0)
public Integer getCodCliente() {
return this.codCliente;
}
ou tem que ser diferente?
como posso fazer para selecionar o proximo valor de uma sequence?
[/quote]
Olá.
Bem, está correto sim. Deve ser no metódo GET.
Para informa o forma de preenchimento do id, informe o GeneratedValue, sendo os tipo AUTO, SEQUENCE, IDENTITY e TABLE.
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
@Column(name = "cod_cliente", unique = true, nullable = false, precision = 10, scale = 0)
public Integer getCodCliente() {
return this.codCliente;
}
[]'s
JL
não há a necessida de ser no método. vc pode anotar no atributo. eu particulamente prefiro no atributo.
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!
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
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.
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
package br.com.ternet.cartao.bean;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
/**
* Classe responsavel por representar um usuario no sistema
* @author Paulo Fernandes
*
*/
@Entity
@Table(name="usuario", schema="public")
public class UsuarioBean implements Serializable {
private static final long serialVersionUID = 7918140502550519009L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
@Column(name="cod_usuario")
private Integer codigo;
@Column(name="nome_usuario")
private String nome;
@Column(name="login")
private String login;
@Column(name="senha")
private String senha;
@Column(name="status")
private Integer status;
@Column(name="tipo_usuario")
private Integer tipoUsuario;
@ManyToOne(fetch=FetchType.LAZY)
private EquipeBean equipe;
// get and set removido para diminuir tamanho do post
}
----------------------------------------------------------------------------------
package br.com.ternet.cartao.bean;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* classe responsavel por representar a equipe de vendas
* @author Paulo Fernandes
*
*/
@Entity
@Table(name="equipe", schema="public")
public class EquipeBean implements Serializable {
private static final long serialVersionUID = 4157547012821652450L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
@Column(name="cod_equipe")
private Integer codEquipe;
@Column(name="nome_equipe")
private String nomeEquipe;
@OneToMany(mappedBy="equipe", fetch=FetchType.LAZY)
private UsuarioBean usuario;
// 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
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;
[quote=paulofernandesjr]beleza, valeu pela dica!
do resto esta tudo ok?
[/quote]
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!
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?
public UsuarioBean read(String login) {
return this.getEntityManager().find(UsuarioBean.class, login);
}
Tenta aê!
deu esse erro aqui…
errei em algum momento no mapeamento
@OneToMany(mappedBy="equipe", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
private List<UsuarioBean> usuarios;
e
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="cod equipe")
private EquipeBean equipe;
O jar do cglib está no classpath?
Eu uso aqui a 2.1_3.
Será que é por que vc tem duas versões da CGLIB no classpath?
Tenta tirar uma e vê qual é…
tirei e deu esse erro aqui
ai quando dou F5 dá aquele erro do cglib
fiz isso aqui no meu controller
/**
* efetua o login na aplicacao
* @return
* @throws SystemException
* @throws HeuristicRollbackException
* @throws HeuristicMixedException
* @throws RollbackException
* @throws IllegalStateException
* @throws SecurityException
*/
public String acessar() throws SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException {
FacesContext context = FacesContext.getCurrentInstance();
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Session sessionBD = factory.openSession();
Transaction transaction = (Transaction) sessionBD.beginTransaction();
String retorno = "sucesso";
LoginBiz biz = new LoginBiz();
if ( biz.isUsuarioValido(usuario) ) {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
session.setAttribute("usuario", usuario);
subMenusList = biz.getSubMenusList(usuario);
} else {
retorno = "falha";
String msg = "Login ou Senha incorretos.";
FacesMessage message = new FacesMessage(msg);
context.addMessage("login", message);
}
transaction.commit();
sessionBD.close();
return retorno;
}
esta correto???
agora deu esse erro aqui