Erro: Hibernate + Enum: simples persistencia

Olá pessoal, mexendo aqui no Hibernate me surgiu a necessidade de persistir @Enum,
ai vc vai dizer, óhhh, mas é muito facil… foi o que eu tambem deduzi procurando no google
e lendo os docs do Hibernate… :smiley:

depois de nao funcionar por várias maneiras diferentes e teste resolvi procurar no forum GUJ…
e adivinha??? achei minha resposta exata neste post :wink:
http://www.guj.com.br/posts/list/61182.java#321357

Só pra variar, aqui ela nao funciona, será que alguem consegue ver onde está o erro? :cry:

meu Bean historico simples de tudo… só pra lembrar no DB (postgres) o campo HISENTRADASAIDA é CHAR(1)

@Entity
@Table(name="HISTORICO")
public class Historico extends com.erp.bean.Entity {

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name="ID", insertable=true, updatable=false)
	private Integer id;
	@Column(name="HISDESCRICAO", insertable=true, updatable=true)
	private String nome;
	
	@Enumerated(EnumType.STRING)
	@Column(name="HISENTRADASAIDA", insertable=true, updatable=false)
	private TipoFinanceiro tipo;

	//Get e Set omitidos, deixe do Enum que segue abaixo...
	public TipoFinanceiro getTipo() {
		return this.tipo;
	}

	public void setTipo(TipoFinanceiro tipo) {
		this.tipo = tipo;
	}
}

Meu Enum TipoFinanceiro lindo e formoso… :slight_smile:

public enum TipoFinanceiro {
	ENTRADA('E'),
	SAIDA('S');

	private Character tipo;
	
	private TipoFinanceiro(Character aTipo){
		this.tipo = aTipo;
	}
	
	public String toString() {
		return tipo.toString();
	}

	public boolean isEntrada(){
		return this==ENTRADA;
	}
	
	public boolean isSaida(){
		return this==SAIDA;
	}
	
	public Character getAsChar(){
		return this.isEntrada()?'E':'S';
	}

}

Enfim o ERRO ao persisitr, como no post citado… ele ainda está jogando o nome do Enum mesmo após eu ter implementado o
override toString() do enum… linha 21

Hibernate: 
    insert 
    into
        HISTORICO
        (HISDESCRICAO, HISENTRADASAIDA, ID) 
    values
        (?, ?, ?)
org.hibernate.exception.DataException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:77)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	at com.erp.dao.HistoricoDAO.insert(HistoricoDAO.java:19)
	at com.erp.app.AppEnumDAO.main(AppEnumDAO.java:17)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into HISTORICO (HISDESCRICAO, HISENTRADASAIDA, ID) values (RECEBIMENTO, ENTRADA, 2) foi abortada. Chame getNextException para ver a causa.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537)
	at org.postgresql.core.v3.QueryExecutorImpl$1.handleError(QueryExecutorImpl.java:403)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:351)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
	... 9 more

o hibernate persiste blz, com o Tipo sendo Character… tambem pensei em deixa Enum @Transient e criar um atributo privato Character e fazer um metodo anotando como @PrePersist… mas é que tenho varios enums nesse estilo como Char no BD com Check constraint`s

será que sou tao burro assim :?: :oops:
HOSIuhOSIhoISHoiHSoiHSOIH

zueiras a parte,
Obrigado desde já pessoal…

caracas…
depois te muito tentar e testar e procurar por ai em outros framework’s…
aparentemente está tudo certo…

mas continua sem funfar… :frowning:

mas sou javeiro e não desisto nunca :wink:

Minha experiência não é grande, vou tentar ajudar com duas sugestões:

acrescente columnDefinition

@Column(name="HISENTRADASAIDA", insertable=true, updatable=false, columnDefinition="char(1)")

defina como String

[code]public enum TipoFinanceiro {
ENTRADA(“E”),
SAIDA(“S”);

private String tipo;  


[/code]

Espero que ajude,

Bridi

Grande bridi vallew mesmo pela sugestão…

mas ainda não funcionou…

Acompanhei pelo Debbuger, ele passa pelo construtor privado do Enum certinho,
o atributo privado String tipo, do enum tem o valor correto mas, pelo menos pelo debbuger,
ele não está passando no meu método toString sobrescrito…

o hibernate nao se utiliza do toString do enum quando está anotado com @Enumerated(EnumType.STRING) ?

continua tentando gravar ENTRADA ao invés de E, visto pela Query do hibernate…

já não sei o que pode ser…
mas obrigado novamente bridi

Implementei tempos atrás um código que funciona, mas é para gravar um inteiro, usando @Type.

Eis as fontes de inspiração: http://appfuse.org/display/APF/Java+5+Enums+Persistence+with+Hibernate
http://www.hibernate.org/272.html

[]'s

vallew Bridi novamente, como não deu certo por enquanto,
resolvi implementar da seguinte forma:

Passei o atributo para Character mantendo o Enum somente nos métodos,
e tirando a anotação @Enumerated do atributo…

	@Column(name="HISENTRADASAIDA", insertable=true, updatable=false)
	private Character tipo;
	. . .
	public TipoFinanceiro getTipo() {
		return TipoFinanceiro.getByChar(this.tipo);
	}
	public void setTipo(TipoFinanceiro tipo) {
		this.tipo = tipo.toChar();
	}

Criei no Enum métodos para converter os valores de Enum para Char e vice/versa…

	public Character toChar(){
		return this.isEntrada()?'E':'S';
	}

	public static TipoFinanceiro getByChar(Character aValue){
		return aValue.equals('E')?ENTRADA:SAIDA;
	}

mas vou continuar tentando… :wink:

Já deu uma lida aqui ?

http://www.hibernate.org/265.html

ou

http://snipplr.com/view/5379/java-5-enum-hibernate-mapping/

ou

http://mihail.stoynov.com/blog/2008/04/03/JPAHibernateAndEnumsUpdated.aspx

No GUJ:
http://www.guj.com.br/posts/list/78790.java
http://www.guj.com.br/posts/list/92675.java#496162

Pra falar a verdade sim…

Mas não consegui avaliar a viabilidade de implementar aquele Enum…
ou implementar da maneira que citei acima…

por que ainda é um projeto tipo “Off-Work”
HSOiuhSOiuhSOIhOIUSH

Porém acredito que da forma citada pelo hibernate seja “mais O.O correta”

mas vallew pela dica netShot
grande abraço…

added -------------------------------------

Então netShot por incrivel que parce eu já havia lido todos estes post’s…
e testei, baseado nas ideias, de certa forma todos também…

mas se vc notar bem, nenhum destes tem o problema parcido com o meu…
e foi só depois disso que postei a minha dúvida, acredite… :wink:

mas vallew pelas sugestões mesmo assim…