2 votes

NHibernate ne crée pas de proxy à moins que la classe ... lazy=true

Considérez des objets comme ceux-ci :

public partial class Record
{
    public int RecordID {get; set;}
    public DateTime? Created { get; set; }
    public int CreatorUserUserObjectNDX { get; set; }
    public UserObject Creator { get; set; }
    ...
}

et

public partial class UserObject
{
  public virtual int ID {get; set;}
  public virtual string Name {get; set;}
}

et leurs mappings comme suit:

Ils sont intentionnellement gardés simples ici, en réalité ils sont plus complexes avec des collections one-to-many, etc., mais ceux-ci fonctionnent, donc ce n'est pas le point ici.

Le problème que j'ai rencontré est que, lorsque j'utilise des définitions et des mappings comme ceux-ci, et que je fais simplement

var results = session.QueryOver()
  .List();

NHibernate NE crée PAS de proxy pour la propriété creator, il utilise simplement des jointures externes dans l'instruction SQL exécutée et insère directement un UserObject. Lorsque je change lazy='false' en lazy='true' dans le mapping pour UserObject, ça fonctionne, le proxy est créé et l'instruction SQL exécutée n'a pas de jointures externes.

Donc, est-il strictement nécessaire de définir lazy='true' pour toutes les classes qui peuvent être une référence n'importe où? Je pensais pouvoir le définir sur false par défaut pour tous les mappings et définir lazy='proxy' dans la définition many-to-one, quand c'est nécessaire.

J'utilise NHibernate 3.2, donc pas de configuration concernant proxyfactory. Que me manque-t-il ici?

3voto

mathieu Points 17729

Si vous définissez lazy=false dans votre mapping, NHibernate n'a pas besoin de créer un proxy, car toutes les propriétés seront chargées immédiatement.

Vous ne devriez pas modifier les paramètres de chargement paresseux sauf si vous avez besoin de chargement immédiat. Même dans ce cas, vous pouvez utiliser "fetch" (dans hql par exemple) pour charger immédiatement ce dont vous avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X