Problema com mapeamento JPA com Enums

3 respostas
Thiago_Ananias

JPA + ENUM

Olá pessoal, estou com um problema em persistir objetos no BD com ENUMs

O seguinte erro é retornado para mim

"javax.persistence.RollbackException: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException Internal Exception: java.sql.SQLException: Incorrect integer value: 'INGLES' for column 'id_lingua' at row 1 Error Code: 1366 Call: INSERT INTO tx_texto_lingua (ID, dt_revisao, vc_texto_lingua, id_lingua, id_texto) VALUES (?, ?, ?, ?, ?) bind => [312, 2008-06-01 19:54:46.765, Usuário, INGLES, 310] Query: InsertObjectQuery(br.com.zean.framework.model.TextoLingua@166fad9)"

O meu mapeamento com Enum está aqui:

package br.com.zean.framework.model;
@Entity
@Table(name="tx_texto_lingua")
public class TextoLingua implements Serializable {

	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	
        @Enumerated(EnumType.STRING)
        @Column(name="id_lingua")
        private Lingua lingua;

	@ManyToOne
	@JoinColumn(name="id_texto", nullable=false)
	private Texto texto;

	@Column(name="dt_revisao")
	private Timestamp revisao;

	@Column(name="vc_texto_lingua", nullable=false)
	private String frase;

}
O ENUM esta aqui
public enum Lingua {

    PORTUGUES, INGLES, ESPANHOL

}

Estava funcionando sem o Enum O QUe será que é?

3 Respostas

J

o campo id_lingua tem que estar como String no banco

F

Thiago,

No caso de você querer gravar um número inteiro, você pode declarar o enum como Ordinal, assim irá salvar um inteiro na ordem em que foi declarado.

Caso você não queira gravar a sequencia, já fiz isso da seguinte forma: declarei meu enum como @Transient, criei uma outra propriedade, declarando ela com o @Column que é apenas privada, criei um método que será chamado antes de persistir os dados, que faz a conversão do enum para o tipo de dado que você quiser. Este método deve ter annotations @PrePersit.

Espero ter ajudado.

Thiago_Ananias

Legal! Foi só colocar como “@Enumerated(EnumType.ORDINAL)” que funcionou! Obrigado!

[]s

Criado 1 de junho de 2008
Ultima resposta 1 de jun. de 2008
Respostas 3
Participantes 3