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?
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.
[quote]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.[/quote]
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?
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.
Daniel,
muito obrigado pelo exemplo citado.
Também vou analisar sua sugestão de usar Strings mesmo, talvez seja mais simples mesmo.
Valeu!
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ó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;
1 curtida
[quote=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;[/quote]
nunca fiz desse jeito
[quote=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[/quote]
Solucionou meu problema! Obrigado!