Olá pessoal,
Estou com dificuldade para usar o relacionamento OneToMany / ManyToOne no Hibernate. Usando o exemplo abaixo, eu consigo retornar as permissões de uma tela dentro da classe Tela, porém, não sei como fazer a persistência utilizando a Collection permissão dentro da classe Tela.
Hoje eu utilizo somente para exibir os dados, para fazer a persistência eu utilizo o Bean da classe Permissao e não o Bean da classe Tela como eu acredito ser o correto.
Classe Tela
@OneToMany(mappedBy=“tela”,cascade=CascadeType.REFRESH, fetch = FetchType.EAGER)
private Collection permissao;
Classe Permissao
@ManyToOne @JoinColumn(name=“tela_id”, insertable=false, updatable=false)
private Tela tela;
Para persistir as permissões usando a classe Tela, creio que você vai precisar alterar o cascade (por exemplo, pode experimentar cascade=CascadeType.ALL em vez de cascade=CascadeType.REFRESH), e também vai ser necessário manipular a coleção enquanto o EntityManager estiver aberto. Se a manipulação da coleção for feita após o fechamento do EntityManager, o JPA não terá como repassar ao Banco de Dados as eventuais alterações.
Obrigado roger_rf!
Estou iniciando em java e hibernate. Você tem um exemplo de como fazer isso?
Desde já agradeço!
A melhor forma para entender como o Hibernate funciona é através do guia de referência:
http://docs.jboss.org/hibernate/stable/core/reference/en/html/
Um capítulo que certamente vai lhe interessar é o mapeamento de coleções:
http://docs.jboss.org/hibernate/stable/core/reference/en/html/collections.html
O guia é todo feito em cima de mapeamentos XML, então você terá de cruzar as informações com as anotações JPA para alcançar os resultados desejados.
Como vocês fazem quando tem essa situação?
Vocês usam as coleções ou outro bean?
Normalmente eu uso coleções através de Set’s. Prós:
- Podem ser usados em quase todos os relacionamentos de coleções encontrados em bases relacionais.
Contras:
- Elementos de Set’s não são acessíveis por índices numéricos, ao contrário do que ocorre com List’s;
- Se você não forçar ordenação (order-by em XML, @OrderBy com anotações) o Hibernate vai criar HashSet’s, que NÃO possuem ordem fixa. Ao forçar ordenação o Hibernate cria LinkedHashSet’s, que possuem ordem fixa e com os quais prefiro trabalhar;
- Set’s não admitem registros duplicados, ao contrário do que ocorre com List’s. Assim, é preciso implementar cuidadosamente equals() e hashCode() em seus objetos de negócio, tanto para evitar duplicações indevidas quanto para garantir que os Set’s não recusem elementos válidos.
Também pode ser interessante usar List’s. Prós:
- Elementos de List’s são acessíveis por índices numéricos.
Contras:
- Ao usar List’s, se a tabela no Banco de Dados não prover uma coluna que funcione como índice, você força o Hibernate a usar a semântica de “bag”, o que às vezes não é desejável.
Há uma excelente discussão sobre isso no link a seguir:
http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html#performance-collections