Diferença entre @OneToMany e @ElementCollection?

129

Qual é a diferença entre usar a @OneToManye @ElementCollectionanotação, pois ambos funcionam no relacionamento um para muitos?

n_g
fonte
3
Em poucas palavras, @ElementCollection é usado quando a existência da entidade-criança não tem sentido sem a entidade pai, IOW, sempre que uma entidade pai é removido, seus filhos vão também ser ...
dellasavia
1
Acredito que NÃO é a Entidade filha, é o Tipo de Valor / Objeto de Valor que está incorporado e cuja existência tem um significado menor sem a Entidade principal na qual está contida.
CuriousMind
concorde com @CuriousMind, na JPA, uma 'Entidade' tem seu próprio ciclo de vida.
mhrsalehi 25/01

Respostas:

124

Eu acredito que @ElementCollectioné principalmente para mapear não-entidades (incorporáveis ​​ou básicas) enquanto @OneToManyé usado para mapear entidades. Então, qual usar depende do que você deseja alcançar.

MrKiane
fonte
1
Obrigado Peder pela resposta! Você tem um ponto válido, pois o @OneToMany pode relacionar apenas entidades.
n_g 23/01
157

ElementCollectioné uma anotação JPA padrão, que agora é preferida à anotação proprietária do Hibernate CollectionOfElements.

Isso significa que a coleção não é uma coleção de entidades, mas uma coleção de tipos simples (Strings, etc.) ou uma coleção de elementos incorporáveis ​​(classe anotada com @Embeddable).

Isso também significa que os elementos pertencem completamente às entidades que os contêm: eles são modificados quando a entidade é modificada, excluídos quando a entidade é excluída etc. Eles não podem ter seu próprio ciclo de vida.

JB Nizet
fonte
... e você não pode consultá-los por conta própria.
Preso
66

@ElementCollectionpermite simplificar o código quando você deseja implementar o relacionamento um para muitos com o tipo simples ou incorporado. Por exemplo, no JPA 1.0, quando você queria ter um relacionamento de um para muitos com uma lista de Strings, era necessário criar uma entidade simples POJO ( StringWrapper) contendo apenas a chave primária e a Stringquestão:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

Com o JPA 2.0, você pode simplesmente escrever:

@ElementCollection
private Collection<String> strings;

Mais simples, não é? Observe que você ainda pode controlar os nomes de tabela e coluna usando a @CollectionTableanotação.

Veja também:

Tomasz Nurkiewicz
fonte
Ótima explicação para o raciocínio. :)
Phuah Yee Keat
4

Básico ou incorporado : @ElementCollection
Entidades : @OneToMany ou @ManyToMany

@ElementCollection:

  • a relação é gerenciada (apenas) pela entidade na qual a relação é definida
  • A tabela contém uma referência de ID à entidade proprietária, mais atributos básicos ou incorporados

@OneToMany / @ManyToMany:

  • também pode ser gerenciado pela outra entidade
  • juntar tabela ou coluna (s) geralmente contém apenas referências de ID
fidudidu
fonte
1

@ElementCollectionmarca uma coleção. Isso não significa necessariamente que esta coleção faça referência a uma junção 1-n.

chzbrgla
fonte
1
Então, qual é exatamente o objetivo do @ElementCollection?
n_g 23/01
0

ElementCollection pode substituir os mapeamentos ou tabelas para sua coleção, para que você possa fazer com que várias entidades façam referência à mesma classe Embeddable, mas cada uma armazene seus objetos dependentes em uma tabela separada.

farshad-nsh
fonte