Question

Bonjour Je développe une non-application Web avec Spring + Hibernate. Ma question est de savoir comment les HibernateDaoSupport poignées de chargement paresseux, car après un appel do DAO, la session est fermée.

Jetez un oeil à la suite psuedo-code:

est comme OAC:

CommonDao extends HibernateDaoSupport{
 Family getFamilyById(String id);
 SubFamily getSubFamily(String familyid,String subfamilyid);
}

modèle de domaine est comme:

Family{
 private List<SubFamily> subfamiles;
 public List<SubFamily> getSubFamiles();
}

SubFamily{
 private Family family; 
 public Family getFamily();
}

Dans l'application, je reçois de DAO app-contexte et que vous souhaitez suivre cette operations.Is possible de faire avec chargement paresseux, car après chaque méthode AFAIK la session est fermée.

CommonDAO dao=//get bean from application context;
Family famA=dao.getFamilyById(familyid);
//
//Do some stuff
List<SubFamily> childrenA=fam.getSubFamiles();

SubFamily asubfamily=dao.getSubFamily(id,subfamilyid);
//
//Do some other stuff
Family famB=asubfamily.getFamily();
Était-ce utile?

La solution

  

Ma question est de savoir comment les HibernateDaoSupport poignées de chargement paresseux, parce que, après un appel à DAO, la session est fermée.

Les OTI ne créent pas / fermer une session pour chaque appel, ils ne sont pas responsables de cela et cela se fait généralement en utilisant le « session ouverte dans le « modèle View (Spring fournit un filtre ou un intercepteur pour cela). Mais ceci est pour les applications Web.

Dans une application swing, une solution consiste à utiliser longue session. Vous aurez à décider des points bien définis au cours de laquelle pour fermer la session pour libérer de la mémoire. Pour de petites applications, ce qui est généralement simple et fonctionne. Pour les plus grands (à savoir des applications de la vie réelle), la bonne solution est d'utiliser une session par image / cadre interne / dialogue. Il est plus difficile à gérer mais l'échelle.

Certains sujets que vous pouvez lire:

Autres conseils

Si vous utilisez déjà Spring, vous pouvez utiliser de son opération-déclaration. L'utilisation de ce que vous êtes en mesure de déclarer une transaction pour une méthode spécifique. Cela permet de maintenir la Sessio ouverte pour le complet tx.

Déclarer l'opération Pointcut

  <!-- this is the service object that we want to make transactional -->
  <bean id="SomeService" class="x.y.service.SomeService"/>

  <tx:advice id="txAdvice" transaction-manager="txManager">
    <!-- the transactional semantics... -->
    <tx:attributes>
      <!-- all methods starting with 'get' are read-only -->
      <tx:method name="get*" read-only="true"/>
      <!-- other methods use the default transaction settings (see below) -->
      <tx:method name="*"/>
    </tx:attributes>
  </tx:advice>

  <!-- ensure that the above transactional advice runs for any execution
      of an operation defined by the FooService interface -->
  <aop:config>
    <aop:pointcut id="MyServicePointcut" expression="execution(* x.y.service.SomeService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="SomeServiceOperation"/>
  </aop:config>

  <bean id="txManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>

Maintenant, vous pouvez le faire paresseux garder la session ouverte pour la méthode complète.

public class SomeService()
{
  public Family getFamily()
  {
    Family famA=dao.getFamilyById(familyid);
    //Do some stuff
    List<SubFamily> childrenA=fam.getSubFamiles();
    SubFamily asubfamily=dao.getSubFamily(id,subfamilyid);
    //Do some other stuff
    return asubfamily.getFamily();
  }
}

Voir Chapitre 9 Springs Tx Référence pour plus de détails.

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