JPA: qual lado deve ser o lado proprietário em am: n relacionamento?

Digamos, por exemplo, eu tive que entidades “Article” e “Tag” (como em um blog típico). Cada artigo pode ter muitas tags, e cada tag pode ser usada por muitos artigos, então é um relacionamento clássico m: n.

Eu preciso especificar um lado de propriedade com o JPA. Mas qual lado deve ser o lado proprietário? Um artigo não depende de uma determinada tag e vice-versa. Existe uma regra geral de qual lado deve ser o lado proprietário?

Cada relacionamento bidirecional requer um lado proprietário no JPA. No caso particular de ManyToMany :

  • @JoinTable é especificado no lado proprietário do relacionamento.
    • o lado proprietário é arbitrário , você pode escolher qualquer uma das duas entidades para ser o proprietário.

Da especificação do JPA:

9.1.26 Anotação ManyToMany

Toda associação muitos-para-muitos tem dois lados, o lado proprietário e o lado não-proprietário ou inverso. A tabela de junit é especificada no lado proprietário. Se a associação for bidirecional, qualquer um dos lados pode ser designado como o lado proprietário.

Você escolhe o lado proprietário considerando onde você deseja que a associação seja atualizada. Você pode atualizar a associação de ManyToMany em apenas um lugar (o lado proprietário). Portanto, a escolha depende de como você deseja gerenciar / atualizar seus campos de associação.

meu ponto de vista:

isso depende do seu negócio. qual entidade é mais importante em seu negócio.

no seu exemplo, acho que o artigo deveria estar do lado,

Também vale a pena mencionar que no JPA o lado proprietário não implica o lado que contém ou o lado que possui as outras entidades. Mais sobre isso aqui: Em uma associação JPA OneToMany / ManyToOne bidirecional, o que significa “o lado inverso da associação”?

Sempre que houver um mapeamento M: N, ou seja, se houver um mapeamento bidirecional, usaremos @ManyToMany e @JoinTable em nosso código.

Para responder a esta pergunta “Qual lado deve possuir o relacionamento” retorna aos modelos que você cria e como os dados devem ser armazenados no database.
Geralmente, as alterações são propagadas apenas para o database a partir do lado do proprietário do relacionamento. Deixe-me explicar como por seu exemplo,

Existem duas tabelas / modelos / POJOs, Article e Tag .
Sempre que uma Post é postada, é feita uma relação com as Tags .
Ou, Sempre que um Book é publicado, é feita uma relação com o Author .
Então, o @JoinColumn deve ir no Post no seu caso.

No MHO, esse é um caso típico em que um relacionamento @ManyToMany é necessário.

Se você usar uma tabela de associação, você pode ter algo em sua class de artigo.

 @ManyToMany @JoinTable(name="TAG_ARTICLE", joinColumns=@JoinColumn(name="ARTICLE_ID"), inverseJoinColumns=@JoinColumn(name="TAG_ID")) private Collection tags; 

Então, na sua class Tag

 @ManyToMany(mappedBy="tags") private Collection
articles;