Problema com Hibernate e Enum

3 respostas
carolino

Boa tarde a todos,

To com um problema usando o hibernate,
tenho as seguintes classes:

public enum Sexo {
	HOMEM(1), MULHER(2);
	
	private int id_sexo;
	
	Sexo(int id){
		id_sexo = id;
	}
}
@Entity
@Table(name="pessoa")
public class Pessoa {
	private int pessoaId;
	private String nomePessoa;
	private Cidade cidade;
	private Sexo sexo;
	
	@Id
	@GeneratedValue
	@Column(name="pessoa_id")
	public int getPessoaId() {
		return pessoaId;
	}
	
	public void setPessoaId(int pessoaId){
		this.pessoaId = pessoaId;
	}
	
	//aqui que está dando o erro
	@Column(name="PESSOA_SEXO",insertable=true,updatable=true)
	public Sexo getSexo() {
		return sexo;
	}
	public void setSexo(Sexo sexo) {
		this.sexo = sexo;
	}
	@Column(name="PESSOA_NOME",length=50,insertable=true, updatable=true)
	@Enumerated(EnumType.STRING)
	public String getNomePessoa() {
		return nomePessoa;
	}
	public void setNomePessoa(String nomePessoa) {
		this.nomePessoa = nomePessoa;
	}
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="pessoa_cidade",insertable=true,updatable=true)
	@Fetch(FetchMode.JOIN)
	public Cidade getCidade() {
		return cidade;
	}
	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}

e no banco, na tabela pessoa existe uma chave estrangeira para o campo sexo que pode ser 1 ou 2

O problema é que ele não consegue converter esse enum definido por HOMEM(1) MULHER(2) para int
na hora de persistir e ele me devolve o seguinte erro:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`regiao`.`pessoa`, CONSTRAINT `pessoa_ibfk_2` FOREIGN KEY (`pessoa_sexo`) REFERENCES `sexo` (`sexo_id`))
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.Util.getInstance(Util.java:381)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)
	at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
	... 18 more

Alguem sabe alguma forma de eu fazer o hibernate entender que o valor vindo do enum é um inteiro?

obrigado a todos que ajudarem…

:smiley:

3 Respostas

luxu

Amigo pq vc usa esse ENUM? nunca usei isso, pq naum monta de outra forma? post suas tabelas do BD pra v…

carolino

Então amigo…
as tabelas estão certas e testadas ( ou seja, funcionando perfeitamente )

A questão do "fazer de outra forma"
Já testei outras formas de inserir esses dados na tabela como por exemplo
criar constantes:

public static final int HOMEM = 1;
public static Final int MULHER = 2;

e depois apenas inserir e deu certo!

Mas infelismente no projeto que estou trabalhando preciso seguir esse padrão de ENUMS

Quando inseridos tipos enums através de notações hibernate, no caso de
Strings utiliza-se o Enumeration(EnumType.STRING)
existe algo equivalente para quando o valor é inteiro?

Pesquisando pela internet já vi que existe uma forma utilizando o @type em conjunto com o @parameters para isto,
mas gostaria de saber se existe uma forma mais facil de fazer isso utilizando ENUMS

carolino

ninguém? :cry:

Criado 16 de abril de 2011
Ultima resposta 18 de abr. de 2011
Respostas 3
Participantes 2