Anotação com Hibernate

9 respostas
R

Boa noite galera, estou fazendo mapeamento com Hibernate mas não sei se estou correto em o que estou fazendo então gostaria de que alguém me falasse se estou correto...

Fiz uma classe Cliente

@Entity
public class Cliente {
	

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column
	@NotNull
	private int coidgo_cliente;
	@Column
	@NotNull
	private String nome;
	@Column
	private String cpf;
	@Column
	private String rg;
	@Column
	@Temporal(TemporalType.DATE)
	private Calendar data_nascimento;
	@Column
	private String telefone_casa;
	@Column
	private String telefone_celular;
	@Column
	private String telefone_outro;
	@Column
	private String email;
	
	@OneToMany(cascade = CascadeType.ALL, mappedBy="cliente")
	private List<Animal>animais = new ArrayList<>();
	
	@OneToMany(cascade = CascadeType.ALL, mappedBy="endereco")
	private List<Endereco>enderecos = new ArrayList<>();
	
	
	public List<Animal> getAnimais() {
		return animais;
	}
	public void setAnimais(List<Animal> animais) {
		this.animais = animais;
	}
	public int getCoidgo_cliente() {
		return coidgo_cliente;
	}
	public void setCoidgo_cliente(int coidgo_cliente) {
		this.coidgo_cliente = coidgo_cliente;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	public String getRg() {
		return rg;
	}
	public void setRg(String rg) {
		this.rg = rg;
	}
	public Calendar getData_nascimento() {
		return data_nascimento;
	}
	public void setData_nascimento(Calendar data_nascimento) {
		this.data_nascimento = data_nascimento;
	}
	public String getTelefone_casa() {
		return telefone_casa;
	}
	public void setTelefone_casa(String telefone_casa) {
		this.telefone_casa = telefone_casa;
	}
	public String getTelefone_celular() {
		return telefone_celular;
	}
	public void setTelefone_celular(String telefone_celular) {
		this.telefone_celular = telefone_celular;
	}
	public String getTelefone_outro() {
		return telefone_outro;
	}
	public void setTelefone_outro(String telefone_outro) {
		this.telefone_outro = telefone_outro;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	
	
	
}

e fiz outra Classe Animal

public class Animal {
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column
	@NotNull
	private int codigo_animal;
	@Column
	@NotNull
	private String nome_animal;
	@Column
	private String raca;
	@Column
	private String cor;
	@Column
	@Temporal(TemporalType.DATE)
	private Calendar data_nascimento;
	@Column
	@Temporal(TemporalType.DATE)
	private Calendar data_vacina;
	@Column
	private String obs;
	
	@ManyToOne
	@JoinColumn(name="cliente_Fk")
	public Cliente cliente;
	
	
	
	public Cliente getCliente() {
		return cliente;
	}
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	public int getCodigo_animal() {
		return codigo_animal;
	}
	public void setCodigo_animal(int codigo_animal) {
		this.codigo_animal = codigo_animal;
	}
	public String getNome_animal() {
		return nome_animal;
	}
	public void setNome_animal(String nome_animal) {
		this.nome_animal = nome_animal;
	}
	public String getRaca() {
		return raca;
	}
	public void setRaca(String raca) {
		this.raca = raca;
	}
	public String getCor() {
		return cor;
	}
	public void setCor(String cor) {
		this.cor = cor;
	}
	public Calendar getData_nascimento() {
		return data_nascimento;
	}
	public void setData_nascimento(Calendar data_nascimento) {
		this.data_nascimento = data_nascimento;
	}
	public Calendar getData_vacina() {
		return data_vacina;
	}
	public void setData_vacina(Calendar data_vacina) {
		this.data_vacina = data_vacina;
	}
	public String getObs() {
		return obs;
	}
	public void setObs(String obs) {
		this.obs = obs;
	}
	
	
	

}

preciso relacionar as duas tipo um cliente pode ter varios animais, fiz o relacionamento gostaria de saber se está correto! Obrigado!

9 Respostas

R
@Entity
@Table(name = "nomeDaTabelaNoBanco", schema="nomeDoEsquamaSeTiver" )
public class Cliente {
	

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="nomeDaColunaNoBanco")
	@NotNull
	private int coidgo_cliente;

	@Column(name="nomeDaColunaNoBanco")
	@NotNull
	private String nome;

	@Column(name="nomeDaColunaNoBanco")
	private String cpf;

	@Column(name="nomeDaColunaNoBanco")
	private String rg;

	@Column(name="nomeDaColunaNoBanco")
	@Temporal(TemporalType.DATE)
	private Calendar data_nascimento;

	@Column(name="nomeDaColunaNoBanco")
	private String telefone_casa;

	@Column(name="nomeDaColunaNoBanco")
	private String telefone_celular;

	@Column(name="nomeDaColunaNoBanco")
	private String telefone_outro;

	@Column(name="nomeDaColunaNoBanco")
	private String email;
	
	@OneToMany(cascade = CascadeType.ALL, mappedBy="cliente")
	private List<Animal>animais = new ArrayList<>();
	
	@OneToMany(cascade = CascadeType.ALL, mappedBy="endereco") 
	private List<Endereco>enderecos = new ArrayList<>();
	
	
	public List<Animal> getAnimais() {
		return animais;
	}
	public void setAnimais(List<Animal> animais) {
		this.animais = animais;
	}
	public int getCoidgo_cliente() {
		return coidgo_cliente;
	}
	public void setCoidgo_cliente(int coidgo_cliente) {
		this.coidgo_cliente = coidgo_cliente;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	public String getRg() {
		return rg;
	}
	public void setRg(String rg) {
		this.rg = rg;
	}
	public Calendar getData_nascimento() {
		return data_nascimento;
	}
	public void setData_nascimento(Calendar data_nascimento) {
		this.data_nascimento = data_nascimento;
	}
	public String getTelefone_casa() {
		return telefone_casa;
	}
	public void setTelefone_casa(String telefone_casa) {
		this.telefone_casa = telefone_casa;
	}
	public String getTelefone_celular() {
		return telefone_celular;
	}
	public void setTelefone_celular(String telefone_celular) {
		this.telefone_celular = telefone_celular;
	}
	public String getTelefone_outro() {
		return telefone_outro;
	}
	public void setTelefone_outro(String telefone_outro) {
		this.telefone_outro = telefone_outro;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
}

Verifique no codigo acima o @Table e @Colunm… se seu Hibernate está pegando o nome do Classe e variáveis para achar as a tabela e colunas do banco… ok

O seu relacionamento Many-to-one e One-to-many está correto! é só testar…

R

Rafael_leal mas quando eu deixo os atributos sem a anotação do nome o Hibernate já reconhece ele como esse nome não é?
exemplo

@Column private String cpf

a tabela no banco de dados vai ter o nome de cpf não é?

seria a mesma coisa do que isso

@Column (name="cpf") private String cpf

F

Não precisa nem disso:

@Column private String cpf;
Vejo muitos usarem esse @Column vazio sem precisar. Assim:

private String cpf;

O Hibernate já reconhece e usa o mesmo nome seguindo sua convenção. @Column é usado se precisar mudar alguma propriedade da coluna, vazio não tem utilidade.

R

fredericomaia10 deixa eu ver se eu intendi então no meu caso eu nem preciso do @Column?

F

rafaelshock:
fredericomaia10 deixa eu ver se eu intendi então no meu caso eu nem preciso do @Column?

Isso.

R

Caso você tenha uma classe, onde os atributos tem o mesmo nome das colunas da tabela que corresponde a ela no banco de dados, não é necessário usar esse @Column.

Por exemplo a classe abaixo que criei esses dias pra estudo:

@Entity
@Table(name = "cliente")
public class Cliente implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1028162372873307236L;
	
	@Id
	@GeneratedValue
	@Column(name = "cod_cliente")
	private Integer cliente;
	
	@OneToOne
	@PrimaryKeyJoinColumn(name = "cod_cliente")
	private Endereco endereco;
	
	@OneToMany(mappedBy = "cliente")
	private List<Locacao> locacoes;
	
	private String nome;
	private String telefone;
	private String celular;
	private String email;

Note que usei Annotations só onde foi estritamente necessário: No atributo cliente, por ter o nome diferente da tabela e pela necessidade de informar ao Hibernate que o código será gerado automaticamente pelo BD.

E os outros dois atributos pra fazer a relação de chave estrangeira e agregação.

:wink:

R

Isso mesmo…

Só tem que ter em mente que em ambientes coorporativos é bom usar(geralemente se usa) @Column(name=“xxxxx”) e @Table(name=“xxxxx”) devido os nomes das colunas e tabelas não serem nada amigaveis para legibilidade do codigo e modelo de dados.

R

Opa galera intendi essa parada agora estou com duvidas em outras coisas das anotações..

um exemplo é esse

tenho uma classe Receber e dentro dessa classe eu preciso do código do Cliente e código do Animal

eu preciso relacionar essas duas classes Animal e Cliente com a tabela Receber?

seria mais ou menos isso? Classe Receber
@OneToOne
	@JoinColumn(name="coidgo_cliente")
	private Cliente cliente;
	
	@OneToOne
	@JoinColumn(name="codigo_animal")
	private Animal animais;

desde de já obrigado!

R

galera estou com o seguinte erro alguém pode me ajudar?

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. Set 25, 2013 10:52:55 AM org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect Set 25, 2013 10:52:55 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation INFO: HHH000422: Disabling contextual LOB creation as connection was null javax.persistence.PersistenceException: [PersistenceUnit: sistemabanhotosa] Unable to build EntityManagerFactory at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:924) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:899) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:59) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) at br.com.sistemabanhotosa.GerarTabelas.main(GerarTabelas.java:10) Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on br.com.banhotosa.Model.Receber.receberes references an unknown entity: java.util.List at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:109) at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1536) at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1457) at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1365) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1756) at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:96) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914) ... 5 more

Criado 16 de setembro de 2013
Ultima resposta 25 de set. de 2013
Respostas 9
Participantes 4