2009-09-09 4 views
0

Fondamentalement, j'essaie de faire la même chose que this question mais avec Fluent NHibernate.Fluent NHibernate - classe/entité spécifique next_hi graines lors de l'utilisation du générateur HiLo

Voici ma convention de génération id:

public class IdGenerationConvention : IIdConvention 
    { 
      public void Apply(IIdentityInstance instance) 
      { 
        instance.GeneratedBy.HiLo("1000"); 
      } 
    } 

Maintenant, cela fonctionne très bien, mais toutes les classes finissent par utiliser la même next_hi.

create table hibernate_unique_key (
      next_hi INTEGER 
    ) 

Est-ce que quelqu'un sait comment spécifier que chaque classe doit utiliser son propre next_hi?

Pour clarifier, je voudrais finir avec quelque chose comme customer_next_hi et order_next_hi, en supposant que cela fonctionne sur la base de colonnes. Si elle est basée sur une ligne, cela convient également, à condition que chaque entité sache quelle ligne utiliser pour sa valeur next_hi.

Répondre

0

J'ai également posé cette question dans le groupe Fluent NHibernate Google et il semble que la seule façon de le faire serait de créer une classe de générateur d'identifiants personnalisés qui hérite de HiLo ou de TableGenerator. D'après ce que je comprends, le problème clé est que l'instruction SQL pour créer la table de départ n'est exécutée qu'une seule fois, et qu'il n'y a pas de commande ou de crochet intégré pour créer des colonnes ou des lignes spécifiques à l'entité.

Donc quelque chose le long des lignes de this est ce que je vais devoir faire. Je posterai plus une fois que j'ai une implémentation de travail.

+0

concept intéressant. J'adorerais le voir une fois que ça marchera. Assurez-vous de poster! – ddc0660

+0

Le plus grand PITA jusqu'à présent est de déterminer toutes les colonnes d'entité à l'avance. La solution liée repose sur un paramètre "allcolumns" dans lequel vous spécifiez les différentes colonnes de départ dont vous avez besoin. J'aimerais que ce soit plus dynamique. –

0

Question intéressante, mais je me demande pourquoi vous voulez le faire? Sur le (assez mineur) inconvénient, vous générez plus de demandes db. À la hausse, vous augmenteriez votre espace d'identification de remplacement par un facteur. Mais Long/BigInt n'est-il pas suffisant pour les combiner? (max 18,446,744,073,709,551,615 ids!)

+0

Pour la plupart, je suis d'accord, il n'y a pas beaucoup de gain à gagner et cela tombe dans la catégorie «si ce n'est pas cassé». Cependant, pour répondre à votre question, je pense que le fait d'avoir des incréments d'ID sur une base par entité (pour des situations comme l'ajout de 1000 commandes entre l'ajout de deux clients). L'autre partie, je l'admets, est de voir comment cela peut être fait. :) –

+0

Oui, je vois ce que vous voulez dire par rapport aux numéros de commande. Il existe cependant une école de pensée selon laquelle les clés de substitution ne devraient avoir aucune utilité ou signification en dehors de l'application (le champ ID ne doit pas servir à la fois de clé de substitution et de numéro de commande). Un autre problème lié à l'utilisation de l'ID dans les deux cas est de repenser l'approche de votre base de données (lors de la mise à l'échelle par exemple) et de passer à une autre stratégie clé (tout en conservant les anciens enregistrements). – UpTheCreek

+0

Hmm, ce SOT a beaucoup de sens et je pense que ce sont des points très valables. Je vais quand même essayer de le faire fonctionner, ne serait-ce que pour avoir une meilleure idée des rouages ​​internes. –

Questions connexes