Hibernate Enum

97 views
Skip to first unread message

Arnaud Santana

unread,
May 6, 2011, 1:17:48 PM5/6/11
to jav...@googlegroups.com
Galera boa tarde, estou precisando de uma grande ajuda de vcs tenho essa enum abaixo e gostaria de persistir somente os valores dela
para o banco de dados exemplo EnumSexo.MASCULINO -> persistir o valor M no banco de dados alguém sabe como posso fazer isso utilizando o hibernate.

public enum EnumSexo {

    FEMININO("F"),
    MASCULINO("M");

    private final String VALOR;
   
    EnumSexo(String valor){
        this.VALOR = valor;
    }

    public String getValor() {
        return VALOR;
    }

    @Override
    public String toString() {
        return VALOR;
    }  
   
}


obrigado pela ajuda

Bruno Maomeh

unread,
May 6, 2011, 1:22:40 PM5/6/11
to jav...@googlegroups.com
o que eu fazia era mapear uma string mesmo, e encapsular ela com o enum, nos getters e setters.. seria algo parecido com:

@Column
private String sexo;

public EnumSexo getSexo() {
    return EnumSexo.getSexo(sexo); //método retorna o enum, baseado na string..
}

public void setSexo(EnumSexo enumSexo) {
     this.sexo = enumSexo.getValor();
}

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Bruno Maomeh
   http://brunomaomeh.wordpress.com

Walter Mourão

unread,
May 6, 2011, 1:30:28 PM5/6/11
to jav...@googlegroups.com
vc tem que criar uma classe que implemente org.hibernate.usertype.EnhancedUserType. No Exemplo abaixo eu extendo um enum (SimNao) para colocar S ou N no banco:

// license-header java merge-point
//
// Attention: Generated code! Do not modify by hand!
// Generated by: hibernate3/HibernateEnumeration.vsl in andromda-hibernate-cartridge.
//
package com.arcadian.logOne.targa.domain;

import org.hibernate.HibernateException;

import java.io.Serializable;
import java.sql.Types;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * <p>
 * Usado para os campos 'S' ou 'N' n�o deve ser usado fora do
 * targa.
 * </p>
 */
public final class SimNaoEnum
    extends com.arcadian.logOne.targa.domain.SimNao
    implements java.io.Serializable,
               org.hibernate.usertype.EnhancedUserType
{

    private static final int[] SQL_TYPES = { Types.VARCHAR };

    /**
     * Default constructor.  Hibernate needs the default constructor
     * to retrieve an instance of the enum from a JDBC resultset.
     * The instance will be converted to the correct enum instance
     * in {@link #nullSafeGet(java.sql.ResultSet, java.lang.String[], java.lang.Object)}.
     */
    public SimNaoEnum()
    {
        super();
    }

    /**
     *  @see org.hibernate.usertype.UserType#sqlTypes()
     */
    public int[] sqlTypes()
    {
        return SQL_TYPES;
    }

    /**
     *  @see org.hibernate.usertype.UserType#deepCopy(java.lang.Object)
     */
    public Object deepCopy(Object value) throws HibernateException
    {
        // Enums are immutable - nothing to be done to deeply clone it
        return value;
    }

    /**
     *  @see org.hibernate.usertype.UserType#isMutable()
     */
    public boolean isMutable()
    {
        // Enums are immutable
        return false;
    }

    /**
     *  @see org.hibernate.usertype.UserType#equals(java.lang.Object, java.lang.Object)
     */
    public boolean equals(Object x, Object y) throws HibernateException
    {
        return (x == y) || (x != null && y != null && y.equals(x));
    }

    /**
     * @see org.hibernate.usertype.UserType#returnedClass()
     */
    public Class<?> returnedClass()
    {
        return com.arcadian.logOne.targa.domain.SimNao.class;
    }

    /**
     *  @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet, java.lang.String[], java.lang.Object)
     */
    public Object nullSafeGet(ResultSet resultSet, String[] values, Object owner) throws HibernateException, SQLException
    {
        final java.lang.String value = (java.lang.String)resultSet.getObject(values[0]);
        return resultSet.wasNull() ? null : fromString(value);
    }

    /**
     * @see org.hibernate.usertype.UserType#nullSafeSet(java.sql.PreparedStatement, java.lang.Object, int)
     */
    public void nullSafeSet(PreparedStatement statement, Object value, int index) throws HibernateException, SQLException
    {
        if (value == null)
        {
            statement.setNull(index, Types.CHAR);
        }
        else
        {
            statement.setObject(index, java.lang.String.valueOf(value));
        }
    }

    /**
     * @see org.hibernate.usertype.UserType#replace(Object original, Object target, Object owner)
     */
    public Object replace(Object original, Object target, Object owner)
    {
        return original;
    }

    /**
     * @see org.hibernate.usertype.UserType#assemble(java.io.Serializable cached, Object owner)
     */
    public Object assemble(java.io.Serializable cached, Object owner)
    {
        return cached;
    }

    /**
     * @see org.hibernate.usertype.UserType#disassemble(Object value)
     */
    public java.io.Serializable disassemble(Object value)
    {
        return (java.io.Serializable)value;
    }

    /**
     * @see org.hibernate.usertype.UserType#hashCode(Object value)
     */
    public int hashCode(Object value)
    {
        return value.hashCode();
    }

    /**
     * @see org.hibernate.usertype.EnhancedUserType#objectToSQLString(Object object)
     */
    public String objectToSQLString(Object object)
    {
        return java.lang.String.valueOf(((com.arcadian.logOne.targa.domain.SimNao)object).getValue());
    }

    /**
     * @see org.hibernate.usertype.EnhancedUserType#toXMLString(Object object)
     */
    public String toXMLString(Object object)
    {
        return java.lang.String.valueOf(((com.arcadian.logOne.targa.domain.SimNao)object).getValue());
    }

    /**
     * @see org.hibernate.usertype.EnhancedUserType#fromXMLString(String string)
     */
    public Object fromXMLString(String string)
    {
        return com.arcadian.logOne.targa.domain.SimNao.fromString(java.lang.String.valueOf(string));
    }
}


Walter Mourão
http://waltermourao.com.br
http://arcadian.com.br
http://oriens.com.br



2011/5/6 Bruno Maomeh <bruno...@gmail.com>

Igor Thiago

unread,
May 6, 2011, 1:26:00 PM5/6/11
to jav...@googlegroups.com
Amigo se fosse você usaria apenas char de 1 caractere e na interface deixaria predefinido a escolha. Imagino que ficaria mais simples que usar enum.
--
Igor Thiago Vulcão da Silva
Bach. em Ciência da Computação
Programador Java
WEB Designer

Contato: (91) 8120-1949
E-mail: vulcaod...@gmail.com
MSN: thiagor...@hotmail.com

Assis Júnior

unread,
May 8, 2011, 6:28:30 AM5/8/11
to jav...@googlegroups.com
Kra, porque vc nao guarda o ordinal ou string mesmo?

Em 6 de maio de 2011 14:17, Arnaud Santana <arnau...@gmail.com> escreveu:

--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Atenciosamente,
Assis júnior
SCJP 5.0 Certified

Marcelo Preis Ferreira

unread,
May 9, 2011, 7:58:17 AM5/9/11
to jav...@googlegroups.com
Pergunta de quem não sabe nada,
Vi o topico dei uma lida no google, Enum

Porque se usa Enum?
O que é Enum de forma simples?

Quais os ganhos que Enum da para uma programação, sabendo que hoje temos muitos recursos
de programação.

Desculpe minhas perguntas ignorantes a respeito do assunto.

Walter Mourão

unread,
May 9, 2011, 8:11:53 AM5/9/11
to jav...@googlegroups.com
O Enum permite que se crie de forma simples um tipo com um número delimitado de possíveis valores. O Enum é elegante.
2011/5/9 Marcelo Preis Ferreira <preis...@gmail.com>

Marcelo Preis Ferreira

unread,
May 9, 2011, 8:20:15 AM5/9/11
to jav...@googlegroups.com
Hum, acho que entendi, Seria delimitar um conjunto de possíveis valores para determinado objeto!

Mesias

unread,
May 9, 2011, 8:21:56 AM5/9/11
to jav...@googlegroups.com
http://stackoverflow.com/questions/417062/enumerations-in-hibernate

 @Enumerated(EnumType.String)
Me pareceu um pouco confuso a parte explicando os tipos do usuário:




2011/5/9 Walter Mourão <walter...@gmail.com>



--
======================================
Alejandro Mesias André Nebra Perez
Java/Python/Js/Something else Programmer
Skype.: meszias
Msn.:    amoavidas...@hotmail.com
Twitter: @meszias
Linux User #442506
Campinas - SP - Brasil - South America
======================================

Leonardo Rodrigues Marques

unread,
May 9, 2011, 9:09:55 AM5/9/11
to javasf: JavaServer Faces Group
Walter Mourão,

É melhor usar ENUM que lançar diretor no código a lista de opções.

Se você precisar incrementar a lista, basta adicionar no ENUM.

Atenciosamente,

Leonardo Rodrigues Marques

On 9 maio, 08:11, Walter Mourão <walter.mou...@gmail.com> wrote:
> O Enum permite que se crie de forma simples um tipo com um número delimitado
> de possíveis valores. O Enum é elegante.
>
> Walter Mourãohttp://waltermourao.com.brhttp://arcadian.com.brhttp://oriens.com.br
>
> 2011/5/9 Marcelo Preis Ferreira <preis.ud...@gmail.com>

Leonardo Rodrigues Marques

unread,
May 9, 2011, 9:19:47 AM5/9/11
to javasf: JavaServer Faces Group
Arnaud,

Eu sugiro fazer uma classe chamda SEXO, e as propriedades que você
deseja.

A vangagem é que você possui a definição do seu tipo no banco e
não apenas a aplicação, ou seja, os seus dados estão todos no mesmo
lugar, no banco.

Eu prefiro colocar todos os meus domínios no banco (code data) e
fazer um cache para não ficar consultando toda hora, do que ficar com
dados de tipo na aplicação e tabelas no banco sem referencia.

Imagine que você tenha no banco uma tabela com vários atributos
vindos de ENUMs que estão na aplicação e você precisa integrar com
outra aplicação em outra linguagem. Ou você precisa fazer um relatório
e tem que colocar na SQL para substituir todos os tipo por seus
valores reais.

Sem contar que estes campos ficam sem integridade relacional.

Não recomendo o uso de ENUM para Sistema de Informação.

Atenciosamente,

Leonardo Rodrigues Marques

Flavio Cysne

unread,
May 9, 2011, 12:10:42 PM5/9/11
to jav...@googlegroups.com
Arnaud,

    concordo com o que o Walter Mourão falou, você terá que criar uma classe que implemente UserType e ParameterizedType para usar na anotação @Enumerated. Além disso, para poder usar M ou F para seleção do Sexo e manter a descrição, você terá que alterar seu enum para ficar parecido com o descrito abaixo:

@Entity
public enum Sexo {
MASCULINO("M","Masculino"),
FEMININO("F","Feminino");

private(String codigo, String descricao) {
    this.codigo = codigo;
    this.descricao = descricao;
}

@Id
private String codigo;
private String descricao;

// getters, não precisa de setters

}


Para mais informações sobre o EnhancedUserType e o GenericUserType, veja o post abaixo:

http://community.jboss.org/wiki/Java5EnumUserType

Espero ter ajudado.
Flávio Cysne

Kenji

unread,
May 9, 2011, 12:20:23 PM5/9/11
to jav...@googlegroups.com
não me apedrejem

:-)

mas eu gosto do jeito "be warned it’s really ugly" do mihail

http://mihail.stoynov.com/2008/04/03/jpa-hibernate-and-enums-updated/

o legal do post dele é que ele explica porque ele chegou nessa escolha.

[]

Kenji


Em segunda-feira, 9 de maio de 2011 10h19min47s UTC-3, Leonardo Rodrigues Marques escreveu:
Arnaud,

    Eu sugiro fazer uma classe chamda SEXO, e as propriedades que você
deseja.

    A vangagem é que você possui a definição do seu tipo no banco e
não apenas a aplicação, ou seja, os seus dados estão todos no mesmo
lugar, no banco.

    Eu prefiro colocar todos os meus domínios no banco (code data) e
fazer um cache para não ficar consultando toda hora, do que ficar com
dados de tipo na aplicação e tabelas no banco sem referencia.

    Imagine que você tenha no banco uma tabela com vários atributos
vindos de ENUMs que estão na aplicação e você precisa integrar com
outra aplicação em outra linguagem. Ou você precisa fazer um relatório
e tem que colocar na SQL para substituir todos os tipo por seus
valores reais.

    Sem contar que estes campos ficam sem integridade relacional.

    Não recomendo o uso de ENUM para Sistema de Informação.

Atenciosamente,

Leonardo Rodrigues Marques

Walter Mourão

unread,
May 9, 2011, 12:24:49 PM5/9/11
to jav...@googlegroups.com
Oi Leonardo,
de fato o Enum só deve ser usado quando não existe previsão de alteração nesses valores ( Sexo, por exemplo). Se o tipo que vc precisa pode necessitar de mudanças de valores durante o tempo de vida útil da aplicação, é melhor usar outro mecanismo (tabelas em banco, configuração, etc.).

Sds,
2011/5/9 Leonardo Rodrigues Marques <leor...@gmail.com>

Walter Mourão

unread,
May 9, 2011, 12:27:15 PM5/9/11
to jav...@googlegroups.com
Outra coisa:


   Sem contar que estes campos ficam sem integridade relacional.

Na verdade a integridade que eles têm é a mais garantida possível... Simplesmente assumem aqueles valores e ponto final.
2011/5/9 Leonardo Rodrigues Marques <leor...@gmail.com>
Arnaud,
Reply all
Reply to author
Forward
0 new messages