Duvida sobre Annotation no Hibernate

0 respostas
marciobarroso

Boa tarde galera,

Estou trabalhando em uma aplicação que escolhi o Hibernate como Framework de persistência.

Já havia trabalhado com ele anteriormente, mas o trabalho era sempre mto doloroso para criar os mapeamentos ou configurar o ant e o XDoclet para gerar automaticamente.

Utilizando as atualizações da API do hibernate, incluindo Annotation e EntityManager, desenvolví este mini framework para o hibernate, onde todas as configurações são feitas de forma bem simples em um .properties, e assim dispensando a criação dos famigerados xml’s de confg e mapeamento. Não preciso usar nenhum xml.

Estou tendo um problema, e imagino q a galera que já está familiarizada com annotations pode me ajudar.

Tenho 2 classes :

/**
 * Project Name	: Loja
 * Class Name	: Cliente.java
 * Created by 	: Márcio Alves Barroso | [email removido]
 * Created on	: 17/03/2006 | 16:22:44
 */
package loja.modelo;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratorType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

/**
 * @author Márcio Alves Barroso
 */
@Entity
public class Cliente implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private Long idCliente;
    private String nome;
    private String sobrenome;
    private String chamarDe;
    private Integer cpfNum;
    private Integer cpfDig;
    private Timestamp nascimento;
    private Long estadoCivil;
    private Empresa empresa;
    
    @Column
    public Integer getCpfNum() {
        return cpfNum;
    }
    @Column
    public Integer getCpfDig() {
        return cpfDig;
    }
    @Column
    public String getChamarDe() {
        return chamarDe;
    }
    @ManyToOne(cascade = (CascadeType.MERGE))
    @JoinColumn(name="idEmpresa")
    public Empresa getEmpresa() {
        return empresa;
    }
    @Column
    public Long getEstadoCivil() {
        return estadoCivil;
    }
    @Id(generate = GeneratorType.AUTO)
    public Long getIdCliente() {
        return idCliente;
    }
    @Column
    public Timestamp getNascimento() {
        return nascimento;
    }
    @Column
    public String getNome() {
        return nome;
    }
    @Column
    public String getSobrenome() {
        return sobrenome;
    }
    public void setCpfNum(Integer cpfNum) {
        this.cpfNum = cpfNum;
    }
    public void setCpfDig(Integer cpfDig) {
        this.cpfDig = cpfDig;
    }
    public void setChamarDe(String chamarDe) {
        this.chamarDe = chamarDe;
    }
    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }
    public void setEstadoCivil(Long estadoCivil) {
        this.estadoCivil = estadoCivil;
    }
    public void setIdCliente(Long idCliente) {
        this.idCliente = idCliente;
    }
    public void setNascimento(Timestamp nascimento) {
        this.nascimento = nascimento;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public void setSobrenome(String sobrenome) {
        this.sobrenome = sobrenome;
    }
    
}

e esta outra classe :

/**
 * Project Name	: Loja
 * Class Name	: Empresa.java
 * Created by 	: Márcio Alves Barroso | [email removido]
 * Created on	: 17/03/2006 | 16:51:52
 */
package loja.modelo;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratorType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

/**
 * @author Márcio Alves Barroso
 */
@Entity
public class Empresa implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long idEmpresa;
    private String nome;
    private String nomeFantasia;
    private Integer cnpjNum;
    private Integer cnpjFil;
    private Integer cnpjDig;
    private Long inscricaoEstadual;
    private Set<Cliente> cliente;
    
    @Column
    public Integer getCnpjDig() {
        return cnpjDig;
    }
    @Column
    public Integer getCnpjFil() {
        return cnpjFil;
    }
    @Column
    public Integer getCnpjNum() {
        return cnpjNum;
    }
    @OneToMany(mappedBy="empresa")
    public Set<Cliente> getCliente() {
        return cliente;
    }
    @Id(generate= GeneratorType.AUTO)
    public Long getIdEmpresa() {
        return idEmpresa;
    }
    @Column
    public Long getInscricaoEstadual() {
        return inscricaoEstadual;
    }
    @Column
    public String getNome() {
        return nome;
    }
    @Column
    public String getNomeFantasia() {
        return nomeFantasia;
    }
    public void setCnpjDig(Integer cnpjDig) {
        this.cnpjDig = cnpjDig;
    }
    public void setCnpjFil(Integer cnpjFil) {
        this.cnpjFil = cnpjFil;
    }
    public void setCnpjNum(Integer cnpjNum) {
        this.cnpjNum = cnpjNum;
    }
    public void setCliente(Set<Cliente> cliente) {
        this.cliente = cliente;
    }
    public void setIdEmpresa(Long idEmpresa) {
        this.idEmpresa = idEmpresa;
    }
    public void setInscricaoEstadual(Long inscricaoEstadual) {
        this.inscricaoEstadual = inscricaoEstadual;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public void setNomeFantasia(String nomeFantasia) {
        this.nomeFantasia = nomeFantasia;
    }
}

Estou conseguindo salvar e carregar normalmente os 2 objetos.

Mas na situação onde :

Cliente c = new Cliente();
Empresa e = new Empresa();
c.setNome("Marcio");
e.setNome("Gif High Tech Ltda");

c.setEmpresa(e);

Session session = HibernateUtil.getSession();
Transaction t = session.beginTransaction();
session.save(c);
t.commit();

Os campos de ambos objetos no banco de dados podem ser setados como null, com exceção dos campos de nome e id …

Isto está me gerando um erro …

Eu gostaria de salvar tipo cascade, que seria salvar primeiro a empresa e depois o cliente, mas esta gerando um erro falando que o campo idempresa não pode ser null, ou seja, não esta salvando a empresa antes do cliente.

alguem sabe me dizer como resolver isso ???

[ :smiley: ]

Criado 3 de abril de 2006
Respostas 0
Participantes 1