2009-04-23 7 views
0

Quelqu'un peut-il suggérer une implémentation DAO pour une application Web?Implémentation de DAO Hibernate

Quel sera le problème si je crée une transaction pour un fonctionnement de base (par exemple findByID(), findALL(), createObject(), deleteObject(), etc.)?

Veuillez suggérer une implémentation DAO prenant en charge les opérations paresseuses.

Répondre

1

Si vous utilisez Hibernate Tools pour générer votre code, les DAO de base seront générés automatiquement pour vous. Vous pouvez construire sur eux.

Quoi qu'il en soit, certains extrait de code que j'utilise pour la transaction:

public void executeTransaction(Object[] parameters, Transact transact) throws ApplicationException 
{ 
    Transaction tx = null; 
    try 
    { 
     tx = HibernateSessionFactory.getSession().beginTransaction(); 
     transact.execute(parameters, tx); 
     tx.commit(); 
     LOG.trace("executeTransaction() success"); 
    } 
    catch (Exception e) 
    { 
     rollback(tx); 
     throw new ApplicationException(e); 
    } 
} 

private void rollback(Transaction tx) throws ApplicationException 
{ 
    LOG.warn("rollback()"); 
    if (tx != null) 
    { 
     try 
     { 
      tx.rollback(); 
     } 
     catch (Exception ex) 
     { 
      LOG.error("rollback() failure",ex);     
     } 
    } 
} 

public interface Transact 
{ 
    public void execute(Object[] parameters, Transaction tx) throws Exception; 
} 

void updateDistrictImpl(final Distretto district) throws ApplicationException, ApplicationValidationException 
{  
try 
{ 
    LOG.trace("updateDistrict[" + distrettoToString(district) + "]"); 

    executeTransaction(new Transact() { 
     public void execute(Object[] parameters, Transaction tx) throws ApplicationException 
     { 
      DistrettoHome DistrettoDAO = new DistrettoHome(); 
      DistrettoDAO.attachDirty(district); 
     } 
     }); 
    LOG.info("updateDistrict[" + distrettoToString(district) + "] success!"); 
} 
catch (ApplicationException e) 
{ 
    LOG.error("updateDistrict() exception: " + e.getLocalizedMessage(), e); 
    throw e; 
} 
} 
+0

je ai proble avec intialization paresseux – user93796

+0

Pourriez-vous élaborer s'il vous plaît? Obtenez-vous la redoutée "exception d'initialisation paresseuse"? –

+0

me dire comment puis-je résoudre problème d'initialisation paresseux.Je veux gérer la transcation en couche de persitance (c.-à DAO) – user93796

0

Il y a 3 options principales:

1) Configurer le chargement correctement paresseux dans vos applications et vos requêtes: Ce n'est pas toujours le de la manière la plus simple car vous ne savez pas toujours comment vos objets seront utilisés dans la couche de présentation lorsque vous développez le DAO.

2) Utiliser le modèle OpenSessionInView: De cette façon, vous serez en mesure de charger des objets liés à la charge dans la couche de présentation. C'est probablement le moyen le plus simple car il nécessite seulement un peu de configuration. Mais soyez prudent car le chargement paresseux peut être assez coûteux et si vous faites quelque chose de louche dans votre couche de présentation, vous pouvez rencontrer des problèmes de performance. Vous pouvez également modifier vos objets à partir de la présentation, ce qui signifie qu'il est plus facile de faire des erreurs de pré-programmation.

3) Ajoutez une couche de service qui convertit votre objet Hibernate en objets de valeur: c'est l'option la plus fine car vous pouvez également restreindre les propriétés de wchi à la présentation. Vous gardez les limites de transaction autour de l'appel de service, ainsi vous êtes sûr que rien ne sera modifié en dehors d'un service.

Dans tous les cas, vous devez au moins essayer de configurer le chargement paresseux correctement. Sinon, vous rencontrerez probablement des problèmes de performance!