2010-12-01 46 views
4

Je développe une application qui traite de deux entités suivantes: Produits (nous le nom de comme X, Y, Z) et Matériaux (a, b, c, ...). Il est connu que chaque produit a une recette qui indique quels matériaux sont nécessaires pour fabriquer ce produit. Par exemple, pour produire un X, nous avons besoin de 2 a, 6 c et 4 d (X = 2a + 6c + 4d).Mise en veille prolongée: cartographie many-to-many à la carte

Voilà comment cela se reflète dans une table de base de données:

Products 
id INT 
name VARCHAR 
... 

Materials 
id INT 
name VARCHAR 
... 

Recipes 
product_id INT 
material_id INT 
count INT 

Le champ « compte » dans la troisième table est un coefficient pour les matériaux du même genre (2, 6, 4 de l'exemple).

Je veux composer la classe de produit ainsi:

public class Product { 
    ... 
    private Map<Material, Integer> recipe; // How many units of each material we need? 
    ... 
} 

est-il un moyen de récupérer toutes les données nécessaires à la recette carte en utilisant Hibernate? L'approche de configuration séparée (sans annotations) est préférée.

+0

Vouliez-vous dire quelque chose comme l'exemple 7.11 (section 7.2.2.2) dans la documentation Hibernate (http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/)? –

Répondre

8

Puisque personne a posté la solution sans annotations, je vais vous montrer la solution avec l'annotation JPA 2.0 @ElementCollection:

@ElementCollection 
@CollectionTable(name = "Recipes", 
    joinColumns = @JoinColumn(name = "product_id")) 
@MapKeyJoinColumn(name = "material_id") 
@Column(name = "count") 
private Map<Material, Integer> recipe; 

Notez également que, puisque la classe des valeurs de votre carte est Integer, solution sans annotations est susceptible de être documenté en tant que «mapping de collection» plutôt que «mapping de relation d'entité».