Hibernate - relacionamento OneToMany / ManyToOne

5 respostas
A

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;

5 Respostas

R

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.

A

Obrigado roger_rf!

Estou iniciando em java e hibernate. Você tem um exemplo de como fazer isso?

Desde já agradeço!

R

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.

A

Como vocês fazem quando tem essa situação?

Vocês usam as coleções ou outro bean?

R

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

Criado 31 de agosto de 2009
Ultima resposta 31 de ago. de 2009
Respostas 5
Participantes 2