Qual é a diferença entre usar a @OneToMany
e @ElementCollection
anotação, pois ambos funcionam no relacionamento um para muitos?
Qual é a diferença entre usar a @OneToMany
e @ElementCollection
anotação, pois ambos funcionam no relacionamento um para muitos?
Respostas:
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.
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.
@ElementCollection
permite 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 String
s, era necessário criar uma entidade simples POJO ( StringWrapper
) contendo apenas a chave primária e a String
questã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 @CollectionTable
anotação.
Básico ou incorporado : @ElementCollection
Entidades : @OneToMany ou @ManyToMany
@ElementCollection:
@OneToMany / @ManyToMany:
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.