quarta-feira, 17 de fevereiro de 2010

Persistindo Enum com Hibernate

Olá, pessoal!

Tive alguns problemas, por isso resolvi criar um tópico para tratar desse assunto.

Para gravar enumeradores num campo varchar, consulte o link: https://www.hibernate.org/265.html

Para gravar enumeradores num campo int, segue a anotação:
@Enumerated(EnumType.ORDINAL)
public Tipo getTipo() {  
 return tipo;
}

Já para gravar uma lista de enumeradores na tabela, é preciso inserir a seguinte anotação:
@CollectionOfElements(fetch=FetchType.LAZY)
@JoinTable(name = "tabelaTipo", joinColumns = @JoinColumn(name = "id_tabelaDestino"))
@Column(name="campoTipo")
public List<Tipo> getListaTipo() {
 if (listaTipo == null){
  listaTipo = new ArrayList<Tipo>();
 }
 return listaTipo;
}

Nesse caso, será gravado o objeto em questão e a lista dos tipos na tabela “tabelaTipo” referenciando o objeto em questão na coluna “id_tabelaDestino” contendo o número correspondente ao tipo na coluna "campoTipo".

É isso aí, pessoal!
Qualquer dúvida, sugestão ou elogio, comente.

Abraços!!!

3 comentários:

  1. Como você mapeou no hibernate.cfg.xml ?
    Porque eu continuo pegando esse erro aqui:

    Could not determine type for: java.util.List, at table: Usuario, for columns: [org.hibernate.mapping.Column(tipoUsuario)]

    E no xml está:



    Na classe Usuário ficou deste tipo:

    @CollectionOfElements(fetch=FetchType.LAZY)
    @JoinTable(name = "tipoUsuario", joinColumns = @JoinColumn(name = "cd_tipoUsuario"))
    @Column(name="tp_tipoUsuario")

    tipoUsuario = tabela que contem o ENUM
    cd_tipoUsuario = campo da tabela tipoUsuario que contem o ID
    tp_tipoUsuario = campo da tabela Usuario que deveria conter as chaves estrangeiras do tipoUsuario

    OBS: se eu não utilizar List eu consigo fazer.. usando apenas 1 tipoUsuario por cada Usuario, porém se eu crio o Enum com List dai da pau.

    Se puder me ajudar agradeço

    ResponderExcluir
  2. Olá, Thiago!
    Fiz um exemplo igual ao que você está precisando:

    @Entity
    public class Usuario {

    private List<TipoUsuario> listaTipoUsuario;
    //...Outros atributos

    @CollectionOfElements(fetch=FetchType.LAZY)
    @JoinTable(name = "tipoUsuario", joinColumns = @JoinColumn(name = "idUsuario"))
    @Column(name="tipoUsuario")
    public List<TipoUsuario> getListaTipoUsuario() {
    if (listaTipoUsuario == null){
    listaTipoUsuario = new ArrayList<TipoUsuario>();
    }
    return listaTipoUsuario;
    }
    }

    public enum TipoUsuario {
    BASICO,
    INTERMEDIARIO,
    AVANCADO;
    }

    //Mapeamento no hibernate.cfg.xml
    //Não precisa mapear o enumerador

    <mapping class="br.com.teste.www.entidade.Usuario"/>


    //Código de criação das tabelas

    CREATE TABLE `tipoUsuario` (
    `id` int(10) AUTO_INCREMENT,
    `idUsuario` int(10),
    `tipoUsuario` tinyint(3) ,
    PRIMARY KEY (`id`)
    )

    CREATE TABLE `Usuario` (
    `id` int(10) AUTO_INCREMENT,
    //... Outros campos
    PRIMARY KEY (`id`)
    )

    ResponderExcluir
  3. Muito bom
    Muito bom!

    Fiz de outra forma, mas foi bem parecido.
    No meu caso, tenho uma classe Filme que terá uma lista de enum de idiomas para o áudio.


    @CollectionOfElements(fetch = FetchType.LAZY)
    @JoinTable(name = "Filme_Idioma", joinColumns = @JoinColumn(name = "filme"))
    @Column(name = "idioma")
    @Enumerated(EnumType.STRING)
    public List getAudio() {
    return audio;
    }

    ResponderExcluir