2017-02-15 1 views
0

Avec un modèle de conception de référentiel (de ce que j'ai compris jusqu'à présent), vous avez un référentiel pour chaque modèle d'entreprise. Tous ces dépôts implémente une interface IRepository:Plusieurs méthodes CRUD similaires avec Hibernate et Repository Pattern?

public interface IRepository<T> { 
    boolean add(T item); 
    boolean update(T item); 
    boolean remove(T item); 
    List<T> query(Specification specification); 
} 

Avec Hibernate, je sauve de nouveaux records cette façon:

try{ 
     tx = session.beginTransaction(); 
     session.save(mappedObject); 
     tx.commit(); 
    } 
    catch (HibernateException e) { 

     if (tx!=null) tx.rollback(); 
     e.printStackTrace(); 
    } 
    finally { 
     session.close(); 
    } 

Ne serait-chaque dépôt ont essentiellement des doublons de la méthode add? Ne serait-il pas alors préférable de créer une classe Repository avec une méthode add déjà définie, etc.?

+0

lorsque vous utilisez un certain référentiel, vous utilisez une application qui reçoit des valeurs génériques, alors vous n'avez pas besoin de mettre en œuvre toutes ces méthodes, sont communs à toutes les classes qui utilisent l'interface de dépôt – cralfaro

Répondre

1

Je vous recommande de créer une implémentation AbstractRepository qui implémente votre interface IRepository pour les méthodes courantes partagées, puis étendez les implémentations de votre référentiel d'entreprise à partir de la classe abstraite.

public abstract class AbstractRepository<T> implements IRepository<T> { 
    @Override 
    public T add(T object) { 
    Session session = openSession(); 
    try { 
     session.getTransaction().begin(); 
     session.save(object); 
     session.getTransaction().commit(); 
     return object; 
    } 
    catch (Exception e) { 
     if (session.getTransaction().getStatus() == TransactionStatus.ACTIVE) { 
     session.getTransaction().rollback(); 
     } 
     throw e; 
    } 
    finally { 
     session.close(); 
    } 
    } 
} 
+0

Après avoir examiné mon système, il existe des classes qui doivent mapper différemment les objets métier vers POJO. Mais tous auraient encore besoin d'appeler la méthode add, est-ce une mauvaise conception de laisser tout le dépôt s'étendre de 'AbsRepo ' pour avoir un add() qui mappe l'objet métier et appelle 'super.add (" mappedObject ")'? – Duy

+0

Pas nécessairement, mais si vous trouvez que vous avez besoin de mapper un POJO à votre type d'entité pour '#add()', je suppose que vous aurez besoin de l'inverse peut-être avec des méthodes similaires. Pourquoi ne pas simplement avoir une classe séparée qui gère la transformation et l'invoquer dans le niveau de code que les appels ajoutent plutôt que d'ajouter cela au niveau db? – Naros