Mapear List de Enum

8 respostas
V

Olá,

estou tentando mapear uma List de enums em uma entidade porém sempre está dando a exceção abaixo:
Coloquei tambem minha entidade e meu enum logo abaixo.

Exception in thread "main" org.hibernate.MappingException: Could not determine type for: java.util.List, at table: PerfilTemp, for columns: [org.hibernate.mapping.Column(funcionalidades)]
	at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:292)
	at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:276)
	at org.hibernate.mapping.Property.isValid(Property.java:207)
	at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:458)
	at org.hibernate.mapping.RootClass.validate(RootClass.java:215)
	at org.hibernate.cfg.Configuration.validate(Configuration.java:1149)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1334)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
	at br.ufg.es.testes.Teste.main(Teste.java:27)

A minha entidade está da seguinte maneira:

@Entity
public class PerfilTemp implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_perfil")
	private Long id;

	@Column(name = "perfil", length = 30, nullable = false)
	private String perfil;

	@ManyToMany
	@JoinTable(name = "perfil_usuario", joinColumns = { @JoinColumn(name = "id_perfil") }, inverseJoinColumns = { @JoinColumn(name = "id_usuario") })
	private Set<Usuario> usuarios = new HashSet<Usuario>();

        //AQUI ESTÁ A MINHA LISTA DE ENUM
	@Enumerated(EnumType.STRING)
	@Column(name = "funcionalidades", nullable = true, length = 20, columnDefinition = "VARCHAR(20)")
	private List<FuncionalidadesEnum> funcionalidades = new ArrayList<FuncionalidadesEnum>();

O meu Enum está basicamente da seguinte forma:

public enum FuncionalidadesEnum {

	CADASTRAR_USUARIO("cadusuario"), EXCLUIR_USUARIO("excusuario"), ALTERAR_USUARIO(
			"altusuario"), PESQUISAR_USUARIO("pesusuario");

	private String funcionalidade;

	private FuncionalidadesEnum(String funcionalidade) {
		this.funcionalidade = funcionalidade;
	}

	public String getFuncionalidade() {
		return this.funcionalidade;
	}

Alguém já teve este problema? Como resolveu?

8 Respostas

D

Olá,

Voce nao pode usar @Enumerated pois seu atributo nao é do tipo Enum e sim do tipo List.

Se voce tivesse um enum ai seria possivel, de uma olhada na documentacao

http://download.oracle.com/javaee/5/api/javax/persistence/Enumerated.html

Abraços
Daniel.

V

Olá,

Voce nao pode usar @Enumerated pois seu atributo nao é do tipo Enum e sim do tipo List.

Se voce tivesse um enum ai seria possivel, de uma olhada na documentacao

http://download.oracle.com/javaee/5/api/javax/persistence/Enumerated.html

Abraços
Daniel.

pensei em passar a lista para uma lista de String e depois persistir, mas não tem como eu persistir direto uma lista de enum?

D

Neste caso acho mais facil voce simplificar…

Use uma classe com Strings mesmo totalmente imutavel (usando final) e persista dessa forma, pois o efeito será exatamente o mesmo que estivesse usando enum.

Se quiser tentar com enum msm, segue o exemplo

Abracos
Daniel.

V

Daniel,
muito obrigado pelo exemplo citado.
Também vou analisar sua sugestão de usar Strings mesmo, talvez seja mais simples mesmo.

Valeu!

V

Caso alguem queira fazer algo parecido segue abaixo como que ficou o mapeamento da minha coleção de Enums:

//... @CollectionOfElements @JoinTable(name = "NOME_DA_TABELA", joinColumns = @JoinColumn(name = "PK_ENTIDADE")) @Column(name = "funcionalidades") private Set<FuncionalidadesEnum> funcionalidades;

[]'s

T

Tópico antigo, mas para quem precisar, aqui vai a solução:

@ElementCollection(fetch = FetchType.LAZY, targetClass = FormaPagamentoEnum.class) @Enumerated(EnumType.STRING) @Column(name = "formaPagamentos", length = 30) @JoinTable(name = "PlanoContratacao_FormaPagamento") private List<FormaPagamentoEnum> formaPagamentos;

T

thiagomoralles:
Tópico antigo, mas para quem precisar, aqui vai a solução:

@ElementCollection(fetch = FetchType.LAZY, targetClass = FormaPagamentoEnum.class) @Enumerated(EnumType.STRING) @Column(name = "formaPagamentos", length = 30) @JoinTable(name = "PlanoContratacao_FormaPagamento") private List<FormaPagamentoEnum> formaPagamentos;

nunca fiz desse jeito

F

victor0402:
Caso alguem queira fazer algo parecido segue abaixo como que ficou o mapeamento da minha coleção de Enums:

//... @CollectionOfElements @JoinTable(name = "NOME_DA_TABELA", joinColumns = @JoinColumn(name = "PK_ENTIDADE")) @Column(name = "funcionalidades") private Set<FuncionalidadesEnum> funcionalidades;

[]'s

Solucionou meu problema! Obrigado!

Criado 13 de outubro de 2011
Ultima resposta 16 de jun. de 2013
Respostas 8
Participantes 5