Mapear tipo enum utilizando Hibernate

Pessoal,

  1. Como eu faço para mapear um atributo do tipo Enum para o hibernate ?
public class Pessoa{

      private Sexo sexo;
      enum Sexo {MASCULINO, FEMININO}
     ....
}
  1. Procurei no site do hibernate http://www.hibernate.org/203.html e encontrei um artigo que fornece uma solução, porém na hora de implementar eu me deparei com um problema. Não encontrei as classes abaixo: Procurei em todos os jars do hibernate 3.2.0-GA e não encontrei estas classes.

import net.sf.hibernate.Hibernate;
import net.sf.hibernate.type.NullableType;

  1. Alguém sabe em qual versão do hibernate se encontram estas classes? ou uma forma elegante de resolver o problema?

Obrigado…

Jukinha :?:

O pacote net.sf aponta para a versão 2.x do Hibernate.

De qualquer forma penso que o que está procurando é este aqui:
http://www.hibernate.org/265.html

Eu implementei minha classe conforme artigo do site http://www.hibernate.org/312.html e me deparei com o um erro, e não consegui entender o motivo.

  1. No mapeamento da classe Pessoa, eu utilizo um atributo que é tipo Enum “com.cbi.bdi.model.common.enumhibernate.HibernateSituacao”, e funciona beleza.
<hibernate-mapping package="com.boavontade.bdi.model.common"> 
  <class name="Pessoa" abstract="true" table="pessoa"> 
    <id name="id" access="field" type="integer" unsaved-value="null" column="id">
      <generator class="native">
        <param name="sequence">sq_pessoa_id</param>
      </generator>
    </id>
    <discriminator column="tipo_pessoa" type="string" not-null="true" length="1"/>
    <version name="versao" column="versao"/>
    <property name="nome" type="string" column="nome" length="50"/>
    <property name="situacao" type="com.cbi.bdi.model.common.enumhibernate.HibernateSituacao" column="situacao"/>
    <property name="email" type="string" column="email" length="50"/>
    <property name="site" type="string" column="site" length="50"/>
    <property name="pseudonimo" type="string" column="pseudonimo" length="50"/>
    <property name="pronuncia" type="string" column="pronuncia" length="30"/>
  </class>
  <subclass name="PessoaFisica" extends="com.cbi.bdi.model.common.Pessoa" discriminator-value="F"> 
    <property name="sexo" type="serializable" column="sexo"/>
    <property name="estadoCivil" type="com.cbi.bdi.model.common.enumhibernate.HibernateEstadoCivil" column="estado_civil"/>
    <property name="dataNascimento" type="date" column="data_nascimento"/>
    <property name="dataExpedicaoRg" type="date" column="data_expedicao_rg"/>
    <property name="estadoRg" type="integer" column="estado_rg"/>
    <property name="dataFalecimento" type="date" column="data_falecimento"/>
    <property name="grauEscolaridade" type="serializable" column="grau_escolaridade"/>
    <property name="rg" type="string" column="rg" length="11"/>
    <property name="cpf" type="string" column="cpf" length="11"/>
    <property name="tituloEleitor" type="string" column="titulo_eleitor" length="12"/>
    <property name="reservistaMilitar" type="string" column="reservista_militar" length="15"/>
    <property name="serieCtps" type="string" column="serie_ctps" length="5"/>
    <property name="numeroCtps" type="string" column="numero_ctps" length="7"/>
  </subclass>
</hibernate-mapping>

public enum Situacao { 
	ATIVO, 
	INATIVO 
};

public class HibernateSituacao extends IntEnumUserType<Situacao> {
	
	public HibernateSituacao(){
		super(Situacao.class, Situacao.values());
	}
}

mas, na sub-classe PessoaFisica, se eu colocar em qualquer atributo o Tipo Enumerado “com.cbi.bdi.model.common.enumhibernate.HibernateEstadoCivil” a minha aplicação não carrega. Como por exemplo:


public enum EstadoCivil{ 
	CASADO,	
	DIVORCIADO, 
	SOLTEIRO,	
	VIUVO 
};

public class HibernateEstadoCivil extends IntEnumUserType<EstadoCivil> {

	protected HibernateEstadoCivil() {
		super(EstadoCivil.class, EstadoCivil.values());
	}

}

dá o seguinte erro ao carregar a aplicação:


10/11/2006 10:10:29 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Arquivos de programas\Java\jdk1.5.0_06\bin;.;C:\WINDOWS\system32;C:\WINDOWS;C:\Arquivos de programas\Borland\Delphi7\Bin;C:\Arquivos de programas\Borland\Delphi7\Projects\Bpl;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Arquivos de programas\Apache\apache-ant-1.6.5\bin;C:\Arquivos de programas\Java\jdk1.5.0_06\bin
10/11/2006 10:10:29 org.apache.coyote.http11.Http11BaseProtocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
10/11/2006 10:10:29 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2047 ms
10/11/2006 10:10:29 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
10/11/2006 10:10:29 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/5.5.17
10/11/2006 10:10:29 org.apache.catalina.core.StandardHost start
INFO: XML validation disabled
log4j:WARN No appenders could be found for logger (org.apache.catalina.startup.TldConfig).
log4j:WARN Please initialize the log4j system properly.
10/11/2006 10:10:38 org.apache.catalina.core.StandardContext start
SEVERE: Error listenerStart
10/11/2006 10:10:38 org.apache.catalina.core.StandardContext start
SEVERE: Context [/bdi] startup failed due to previous errors
10/11/2006 10:10:40 org.apache.coyote.http11.Http11BaseProtocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
10/11/2006 10:10:40 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
10/11/2006 10:10:40 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/47 config=null
10/11/2006 10:10:40 org.apache.catalina.storeconfig.StoreLoader load
INFO: Find registry server-registry.xml at classpath resource
10/11/2006 10:10:40 org.apache.catalina.startup.Catalina start
INFO: Server startup in 11484 ms

Se eu tirar do atributo o tipo HibernateEstadoCivil e colocar como Integer funciona beleza.

Por favor alguém poderia me ajudar?

OBS: Utilizo Spring + JSF + Hibernate.

Obrigado.

Jukinha :?: