Boa tarde pra todos!
Eu estou começando a explorar o Hibernate agora e estou com a seguinte dúvida:
No meu programinha, eu preciso de duas classes: Contato e Endereço. Bom, um contato só pode ter um endereço, e um endereço pertence a um único contato. A tabela contato foi criada normalmente com um campo id e a tabela de endereços compartilha esse mesmo campo através de chave estrangeira.
Tenho dúvidas na codificação dessas duas classes e nos seus respectivos mapeamentos XML, com relação a definição das chaves e relacionamento, tanto no código Java quanto nos mapeamentos.
Tentei fazer algumas experiências com classes bem simples e mapeamentos XML utilizando “<one-to-one>” mas não fui muito feliz…
A versão do hibernate é a 3.0.5.
Se alguém puder me dar uma luz, eu ficaria muito grato!
Obrigado.
Ah galera seguinte… fiquei aqui quebrando a cabeça mas consegui! Vou postar o código das classes e seus mapeamentos XML para ajudar quem passa pelo mesmo problema que eu…
Novamente obrigado a todos!
Contato.java
package negocio;
import util.Data;
public class Contato {
private Integer id;
private String nome;
private String email;
private Integer maxEmp;
private Data nascimento;
private String obs;
private Endereco endereco;
public Contato() {}
public Contato(Integer id, String nome, String email, Integer maxEmp, Data nascimento, String obs, Endereco endereco) {
this.setId(id);
this.setNome(nome);
this.setEmail(email);
this.setMaxEmp(maxEmp);
this.setNascimento(nascimento);
this.setObs(obs);
this.setEndereco(endereco);
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getMaxEmp() {
return maxEmp;
}
public void setMaxEmp(Integer maxEmp) {
this.maxEmp = maxEmp;
}
public Data getNascimento() {
return nascimento;
}
public void setNascimento(Data nascimento) {
this.nascimento = nascimento;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getObs() {
return obs;
}
public void setObs(String obs) {
this.obs = obs;
}
public Endereco getEndereco() {
return this.endereco;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
}
Contato.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="negocio.Contato" table="contato">
<!-- Identificador da classe -->
<id name="id" column="con_id">
<generator class="increment"/>
</id>
<!-- Propriedades da classe -->
<property name="nome" column="con_nome" type="string"/>
<property name="email" column="con_email" type="string"/>
<property name="maxEmp" column="con_maxemp" type="integer"/>
<property name="nascimento" column="con_nascimento" type="persistencia.DataUserType"/>
<property name="obs" column="con_obs" type="string"/>
<!-- Relacionamento da classe -->
<one-to-one
name="endereco"
class="negocio.Endereco"
cascade="all"
/>
</class>
</hibernate-mapping>
Endereco.java
package negocio;
public class Endereco {
private Integer id;
private String rua;
private String cep;
private String bairro;
private String cidade;
private String uf;
private Contato contato;
public Endereco() {}
public Endereco(Integer id, String rua, String cep, String bairro, String cidade, String uf, Contato contato) {
this.setId(id);
this.setRua(rua);
this.setCep(cep);
this.setBairro(bairro);
this.setCidade(cidade);
this.setUf(uf);
this.setContato(contato);
}
public String getBairro() {
return bairro;
}
public void setBairro(String bairro) {
this.bairro = bairro;
}
public String getCep() {
return cep;
}
public void setCep(String cep) {
this.cep = cep;
}
public String getCidade() {
return cidade;
}
public void setCidade(String cidade) {
this.cidade = cidade;
}
public Integer getId() {
return id;
}
public void setId(Integer contato) {
this.id = contato;
}
public String getRua() {
return rua;
}
public void setRua(String rua) {
this.rua = rua;
}
public String getUf() {
return uf;
}
public void setUf(String uf) {
this.uf = uf;
}
public Contato getContato() {
return this.contato;
}
public void setContato(Contato contato) {
this.contato = contato;
}
}
Endereco.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="negocio.Endereco" table="endereco">
<!-- Identificador da classe -->
<id name="id" column="con_id">
<generator class="foreign">
<param name="property">contato</param>
</generator>
</id>
<!-- Propriedades da classe -->
<property name="rua" column="end_rua" type="string"/>
<property name="cep" column="end_cep" type="string"/>
<property name="bairro" column="end_bairro" type="string"/>
<property name="cidade" column="end_cidade" type="string"/>
<property name="uf" column="end_uf" type="string"/>
<!-- Relacionamento da classe -->
<one-to-one
name="contato"
class="negocio.Contato"
constrained="true"
/>
</class>
</hibernate-mapping>
Na data de nascimento do contato eu utilizei uma classe Data que eu mesmo criei, e a classe DataUserType é a classe que a representa (para tal é necessário implementar a interface UserType, mas isso já é outra história :roll: