Question

J'ai le mappage Hibernate suivant, qui doit être mappé à l'aide de la table par hiérarchie de classes de béton:

<hibernate-mapping package='dao'>
    <meta attribute='class-description'></meta>
    <class name='PropertyDAO'>
        <id name='id' column='id_property'>
            <generator class='assigned'/>
        </id>
        <property name='address' column='address' type='string'/>
        <union-subclass name='HouseDAO' table='house'>
            <property name='noOfRooms' column='noOfRooms'/>
            <property name='totalArea' column='totalArea'/>
            <property name='price' column='price'/>
        </union-subclass>
        <union-subclass name='LandDAO' table='land'>
            <property name='area' column='area'/>
            <property name='unitPrice' column='unitPrice'/>
        </union-subclass>
    </class>
</hibernate-mapping>

Ce qui signifie que dans la base de données, je n'ai que 2 tables:

  • maison (id_property (PK), adresse, noOfRooms, totalArea, price)
  • land (id_property (PK), adresse, area, unitPrice)

Autant que je sache, dans ce cas, les identifiants doivent être générés explicitement avant d'appeler .save (), ma question est donc: comment puis-je créer une stratégie pour la génération automatique des identifiants, de sorte que les identifiants provenant de la classe concrète forme un domaine continu une fois jointe.

Était-ce utile?

La solution 3

La solution consiste à créer une autre table qui stocke l'id suivant. cette valeur doit être modifiée chaque fois qu'un utilisateur souhaite insérer une nouvelle entité. De cette façon, le domaine est continu

Autres conseils

À mon humble avis, votre modèle dans la base de données est erroné car vous disposez d’informations redondantes sur plusieurs tables liées.

Le tableau par classe concrète est un modèle d'héritage qui pose des problèmes lors de l'exécution, car il est possible de mettre à jour l'adresse de Land mais pas celle de Maison tant qu'elles sont identiques (sémantiquement). Iow: déposez ce modèle et introduisez table-par-sous-classe, de sorte que vous ayez une table de base de propriété avec id et adresse et deux tables séparées avec une PK qui est un FK pour le pk de la base de propriété, l'une est la maison avec les champs spécifiques à la maison , l'autre est la terre avec les champs spécifiques à la terre.

Cela vous donnera le plus petit nombre de problèmes car c'est le moyen de convertir l'héritage entre types d'entités en tables relationnelles (voir les livres de Nijssen / Halpin sur NIAM / ORM)

J'ai utilisé ce qui suit avec join-subclass

<key column="id"/>

Cela devrait obliger les sous-classes à utiliser les identifiants de la table de propriétés, car ils en dépendent. (le super) La colonne fait référence à la colonne de la sous-classe qui est une référence étrangère au super.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top