Plusieurs champs @ManyToOne pointant vers la même entité dans JPA / Hibernate

J’ai une entité de Order qui a une billingAddress et une billingAddress shippingAddress . J’ai aussi une entité d’ Address . J’essaie de faire en sorte qu’une seule table d’adresses contienne à la fois les adresses d’expédition et de facturation, car rien ne permet de les différencier, et les adresses de facturation et de livraison peuvent être identiques dans une ou plusieurs commandes. J’ai utilisé @ManyToOne dans les champs d’adresse de la Order , mais je ne suis pas sûr de la manière appropriée de rendre cette fonction bidirectionnelle.

J’ai deux questions:

  1. Est-ce que @ManyToOne est approprié pour les champs d’adresse, puisqu’il s’agit en réalité d’une relation n: 2 que j’utilise simplement deux champs distincts pour représenter? Si non, que devrais-je faire à la place?
  2. En supposant que 1. soit OK, comment rendre le mappage bidirectionnel (Quelles annotations dois-je utiliser dans l’entité Address ?)? Cela peut-il être fait en listant plusieurs colonnes dans une annotation dans Address ?

Code:

 @Entity @Table(name = "orders") public class Order { //... private Address shippingAddress; private Address billingAddress; @ManyToOne @JoinColumn(name = "shipping_address_id", referencedColumnName = "address_id", nullable = false) public Address getShippingAddress() { return shippingAddress; } @ManyToOne @JoinColumn(name = "billing_address_id", referencedColumnName = "address_id", nullable = false) public Address getBillingAddress() { return billingAddress; } //... } @Entity @Table(name = "addresses") public class Address { //address1, address2, city, state, etc. //how to link back to Orders? private Set orders; } 

En ce qui concerne votre première question: est-ce un ManyToOne?

Ça dépend. Si plusieurs commandes peuvent avoir la même adresse de livraison, il s’agit d’un ManyToOne. Si une seule commande peut avoir une adresse de livraison donnée, il s’agit d’un OneToOne. Idem pour l’adresse de facturation.

Je ne suis pas sûr que rendre l’association bidirectionnelle soit une bonne idée. Je ne le ferais probablement pas dans ce cas. Mais si vous voulez le rendre bidirectionnel, vous devez le faire également . Vous avez en effet deux associations différentes ici. Le mappage ressemblerait donc à ceci:

 @OneToMany(mappedBy = "shippingAddress") private Set shippedOrders; @OneToMany(mappedBy = "billingAddress") private Set billedOrders; 

ou, si l’association est en fait un OneToOne (voir la réponse à la première question):

 @OneToOne(mappedBy = "shippingAddress") private Order shippedOrder; @OneToOne(mappedBy = "billingAddress") private Order billedOrder;