Question

Si avoir une entité A à l'un ou à zéro à une cartographie avec l'entité bidirectionnelle B.

La mise en correspondance est la suivante:

<class name="EntityA" table="TABLE_A" mutable="true" lazy="true">
    <id name="idA" type="long" column="pk_a" unsaved-value="null">
        <generator class="sequence">
            <param name="sequence">pk_a_seq</param>
        </generator>
    </id>
    <one-to-one name="propertyB" class="EntityB" property-ref="propertyA" constrained="true" outer-join="false"/>
</class>

et

<class name="EntityB" table="TABLE_B" mutable="true" lazy="true">
    <id name="idB" type="long" column="pk_b" unsaved-value="null">
        <generator class="sequence">
            <param name="sequence">pk_b_seq</param>
        </generator>
    </id>
    <many-to-one name="propertyA" class="EntityA" not-null="true" unique="true" lazy="proxy" column="fk_a"/>
</class>

Quand je fais une requête HQL (ou plutôt, une requête HQL nommée) pour l'Entité, mise en veille prolongée charge avec impatience # propertyB avec l'Entité une instruction select séparée.

Mon problème qui est si mes déclarations HQL 1000 de l'Entité (avec tous ayant de leur propre Entité B respective), mise en veille prolongée fera n + 1 requêtes (1ère requête serait pour l'Entité 1000 résultats retour, alors que les requêtes n seraient à venir de le # propertyB sélectionnez l'Entité lazy loading).

Cependant, je ne suis pas besoin de ces # propertyB de l'Entité qui est pourquoi je veux les paresseux charge à la place (sans utiliser hibernate une requête SQL séparée).

Est-ce possible? Et si elle est, comment puis-je faire?

Merci, Franz

Était-ce utile?

La solution

J'ai corrigé ce problème.

Ce que je faisais était de créer tourner le champ # propertyB dans l'Entité un jeu avec le nom entityA # propertyBs. Mais je conservais le # getPropertyB l'Entité () et # setPropertyB l'Entité (propertyB Entité B) Méthodes accesseurs.

Les corps des méthodes de ces méthodes d'accès sont maintenant quelque chose comme ceci:

public EntityB getPropertyB() {
    return CollectionUtils.get(propertyBs, 0);
}

public void setPropertyBs(EntityB propertyB) {
    propertyBs= Collections.singleton(propertyB);
}

Alors dans ma correspondance, je cartographié les set entityA # propertyBs et préciser l'accès aux « champ ».

<set name="scheduledAdInfos" lazy="true" fetch="subselect" access="field" cascade="none" inverse="true">
    <key column="pk_a"/>
    <one-to-many class="EntityB"/>
</set>

Avec cette configuration, vous pouvez créer un mappage paresseux de la possession POJO (l'Entité) à la propriété POJO (Entité B), même si TABLE_A appartient à TABLE_B.

Autres conseils

Réponse courte: Non, vous ne pouvez pas le faire, du moins pas sans changer la base de données et la cartographie. Vous avez essentiellement à inverser l'un à une cartographie et la relation clé étrangère de travailler de la manière que vous voulez.


Deuxième réponse: Mise en veille prolongée peuvent faire les associations de charge paresseux. La façon dont il le fait est en injectant un objet proxy qui détient l'ID de l'objet référencé.

Dans votre cas, la mise en correspondance est telle que la colonne de clé étrangère est en TABLE_B, à savoir où vous utilisez plusieurs-à-un. Donc, si vous chargez un B, mise en veille prolongée trouve la référence FK dans la colonne fk_a et peut créer un proxy qui détient cette valeur. Si le proxy est accédé à l'entité correspondante est chargée.

Que faire si un enregistrement de la table A est sélectionné? Hibenate va créer un objet A, mais pour être en mesure de remplir le propertyB, il devra se pencher sur la TABLE_B, pour trouver la ligne correspondante avec fk_a = a.id. Il n'y a pas d'autre moyen pour Hibernate pour savoir quel enregistrement charger au temps de chargement paresseux.

En fait, ce serait une amélioration pour Hibernate, car il devrait également être en mesure de faire le chargement d'autres clés uniques lors du chargement paresseux, mais la mise en œuvre actuelle ne permet pas, vous pouvez peut-être soulever une question.

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