Relacionamento com Hibernate 3 - FK null

3 respostas
P

Saudações aos colegas de desenvolvimento…
Estou com um grande problema em Hibernate.
Tenho duas classes (aquele exemplo besta de quem ta começando) :wink:

@Entity
@Table(name = "aluno")
public class Aluno implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Basic(optional = false)
    @Column(name = "idaluno")
    private Integer idaluno;
    @Column(name = "dataCadastro")
    private String dataCadastro;
    @Column(name = "nome")
    private String nome;
    @Column(name = "dataNascimento")
    private String dataNascimento;
    @Column(name = "nacionalidade")
    private String nacionalidade;
    @Column(name = "naturalidade")
    private String naturalidade;
    @Column(name = "sexo")
    private String sexo;
    @Column(name = "rg")
    private String rg;
    @Column(name = "cpf")
    private String cpf;
    @Column(name = "foto")
    private String foto;
    @Column(name = "ativo")
    private Boolean ativo;
    @Column(name = "certNascimento")
    private String certNascimento;
    @Column(name = "escolaOrigem")
    private String escolaOrigem;
    @Column(name = "login")
    private String login;
    @Column(name = "senha")
    private String senha;
    @Column(name = "observacao")
    private String observacao;

//mapeando o endereço
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="endereco_idendereco")
    private Endereco endereco;

//mapeando os responsáveis
    @OneToMany(mappedBy="aluno",cascade=CascadeType.ALL)
    private List<Responsavel> responsaveis;
(... gets e sets)

e

@Entity
@Table(name = "endereco")
public class Endereco implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Basic(optional = false)
    @Column(name = "idendereco")
    private Integer idendereco;
    @Column(name = "rua")
    private String rua;
    @Column(name = "numero")
    private Integer numero;
    @Column(name = "bairro")
    private String bairro;
    @Column(name = "cidade")
    private String cidade;
    @Column(name = "uf")
    private String uf;
    @Column(name = "cep")
    private String cep;

    @OneToOne
    @JoinColumn(name="contato_idcontato")
    private Contato contato;

    @OneToOne(mappedBy="endereco")
    private Aluno aluno;
(..gets e sets)

Meu problema é quando eu faço um inserção de aluno, quero que o endereço também seja persistido e o idendereco vá para a chave estrangeira de aluno.
Faço todo o processo de configuração no xml ( e outras coisas) abro sessão, inicio um atransação, seto os atributos de endereço, seto os atributos de aluno, atribuo o endereço ao aluno (setEndereco(e)) e mando persistir…
AI VEM A BRONCA…
Dava uma mensagem de endereco_idendereco não pode ser null… se ele era pra ser relacionado com o aluno pq o Hibernate ta tentando colocar null nessa coluna, onde deveria de estar o id do endereço que persistiu…
Algum erro em meu mapeamento?
Por favor, me ajudem…

3 Respostas

root_

Amigo… o salvamento/Update em cascata, no seu caso, que é de salvar o endereço junto… teria que já definir a ID do endereço.

D

To com um problema identico ao seu, a minha dúvida seria quando colocamos o generatedValue ele não deveria colocar um valor da sequencia?

root_

Cara… pelo generator fica impossível de se fazer… tb passei por muitos casos desses, e a solução que encontrei foi a seguinte:
No meu HibernateUtil tenho duas funções:

public static Integer newIdInteger(String id, String tabela, String clausuaWhere)
    {
        Integer maxId = (Integer)getMaxID(id, tabela, " "+clausuaWhere);
        if(maxId == null)
            maxId=0;
        return maxId+1;
    }

  private static Object getMaxID( String id, String tabela, String clausulaWhere)
    {
        Session sessao = getSession();
        Object obj = sessao.createSQLQuery("SELECT MAX(" +id+ ") AS ID FROM " +tabela + " "+clausulaWhere).uniqueResult();
        sessao.close();
        if(obj==null)
            return null;
        return obj;
    }

Exemplo(Bem simplificado):

Pessoa a = new Pessoa(); // pessoa vai ter um Id gerado pelo Generator
Endereco b = new Endereco();
b.setId = HibernateUtil.newIdInteger("COD", "ENDERECO", "");
b.setPessoa(a);
b.setBairro("BLA BLA BLA");
b.setCidade("GURUPI");
b.setUF("TO");
b.setLogradouro("onde o vento faz a curva");
genericDAO.save(a);

Desssa forma, eu consigo definir antes o ID do endereço antes de salvar o cadastro da pessoa… sendo que o hibernate, com o mapeamento do generator, só faz isso em tempo de persistência.

ficou claro agora jovens?

Criado 17 de fevereiro de 2009
Ultima resposta 12 de mai. de 2010
Respostas 3
Participantes 3