Mapear List de Enum

8 respostas
victor0402

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

danieldomingues86

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.

victor0402

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?

danieldomingues86

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.

victor0402

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

Valeu!

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

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;

tmvolpato

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

FredMestre

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