2009-11-08 6 views
4

J'essaie de concevoir une application assez simple et je me suis un peu confondu avec la définition de Hibernate des objets entité et valeur (comme défini dans le chapitre 4 de Java Persistence avec Hibernate).Valeur objet objet ou entité dans mon mappage Hibernate?

Ce que j'ai est une application avec les clients, qui peuvent passer des commandes (relation un à plusieurs). Chacun de ces ordres a beaucoup de lignes de commande (aussi un à plusieurs). Maintenant, je pense que les clients ont une identité (numéro de client) et que les commandes (numéros de commande) sont donc des objets d'entité? Ma confusion vient avec les lignes de commande.

Une ligne de commande a la quantité, le numéro de produit et le prix. Une ligne de commande ne peut pas exister sans son ordre et n'a pas d'identité propre, donc je la vois comme un objet de valeur. Mais je ne peux pas faire de ligne de commande une partie de la table de commande car il y a une relation un à plusieurs entre un ordre et ses lignes de commande. Comment les relations un à plusieurs fonctionnent-elles avec la définition d'un objet de valeur? Du livre Mise en veille prolongée:

« Un objet de type de valeur n'a pas d'identité de base de données, il appartient à une instance d'entité et de son état persistant est intégré dans la ligne de table de l'entité propriétaire des types de valeur ne sont pas des identificateurs. ou propriétés identifiantes »

Si quelqu'un peut éclaircir ma confusion, je voudrais vraiment l'apprécier :)

Répondre

6

documentation Hibernate fait une distinction entre Entité Type et Valeur Type, pas Objet de valeur.

  • Objet de type d'entité: a sa propre identité de base de données
  • objet de valeur Type: appartient à une entité, et son état persistant est intégré dans la ligne de table de l'entité propriétaire. Les types de valeur n'ont pas d'identifiants ou de propriétés d'identificateur.

Pour autant que je me souvienne, le livre utilise un échantillon avec une address représentée comme une chaîne et un objet user, qui contient une adresse chaîne:

  • Mis en œuvre en tant que valeur type (qui signifie généralement une colonne dans la même table au niveau de la base de données), si l'utilisateur est supprimé, il en va de même de son adresse. L'adresse ne peut pas vivre sans l'utilisateur et ne peut pas être partagée.

  • Mis en œuvre en tant que type d'entité (ce qui signifie probablement utiliser une table distincte), les adresses existeraient de leur propre chef sans l'utilisateur et deux utilisateurs seraient en mesure de partager la même adresse.

Dans votre cas, une ligne de commande ne fait pas partie d'un ordre, son état persistant est pas intégré dans la ligne de commande (n'a pas de sens), il a sa propre identité (en la orderId et productId). La ligne de commande n'est certainement pas un type de valeur, c'est un type d'entité.

En fait, dès que vous pensez en termes d'associations (un à un, un à plusieurs, etc.), vous êtes pour les entités sûr la manipulation.

1

Je pense que ce que vous avez est une question ORM plutôt générique.

Vous avez mentionné "Une ligne de commande ne peut pas exister sans sa commande et n'a pas d'identité propre".
Bien que OrderLine ne puisse pas exister avec un Order, cela ne veut pas dire qu'il ne peut pas avoir d'identité.

Prenez votre entité de commande, elle ne peut pas exister sans un client, mais vous l'avez déjà considéré comme une entité, oui?

Alors, voici une suggestion pour les entités:
- Client (peut avoir un ou plusieurs entités de l'Ordre)
- commande (peut avoir une ou plusieurs entités OrderLine)
- OrderLine

1

Je pense que vous êtes à la recherche d'un élément composite. Il y a un exemple dans la référence qui utilise réellement Order et purchasedItems (lignes de commande). Lorsqu'Hibernate dit qu'il ne peut pas supporter seul, cela ne signifie pas qu'il ne peut pas avoir sa propre table, juste que c'est toujours associé à l'élément parent:

<class name="eg.Order" .... > 
    .... 
    <set name="purchasedItems" table="purchase_items" lazy="true"> 
    <key column="order_id"/> 
    <composite-element class="eg.Purchase"> 
     <property name="purchaseDate"/> 
     <property name="price"/> 
     <property name="quantity"/> 
     <many-to-one name="item" class="eg.Item"/> 
    </composite-element> 
    </set> 
</class> 

De: Collections of dependent objects

0
objet de valeur

est un petit objet qui représente une entité simple dont l'égalité n'est pas basée sur l'identité: deux objets valeur sont égaux quand ils ont la même valeur, pas forcément le même objet

0

Vous pouvez faire des lignes de commande comme type de valeur Le type de valeur est pris en charge avec le mappage un-à-un et le mappage un-à-plusieurs. De toute évidence Java Collections sont utilisées pour cartographier la * -à-plusieurs de type valeur avec entity.Inside collection appropriée, élément et élément composite sont utilisés selon les besoins et est décrit ci-dessous: Pour un à plusieurs entre l'entité et la valeur type (type non JDK), élément composite est utilisé. Pour un à-plusieurs où la table de type de valeur doit contenir un seul attribut de type JDK (par exemple chaîne), élément est utilisé. Ce concept est présenté au chapitre 6 de la persistance Java avec Hibernate. Pour plus de détails, reportez-vous ce lien https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/components.html

Questions connexes