2017-02-15 72 views
0

使用存儲庫設計模式(我迄今爲止瞭解的)可以爲每個業務模型創建一個存儲庫。所有這些存儲庫實現IRepository接口:使用Hibernate和Repository模式的多個類似的CRUD方法?

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

與Hibernate,我保存新的記錄是這樣的:

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

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

難道不是每個庫中的add方法的基本重複?用已經定義好的add方法等來創建一個Repository類會不會更好?

+0

當你使用一些庫,您所使用的接收通用值一些實施,那麼你並不需要實現所有這些方法,是其使用的存儲庫接口 – cralfaro

回答

1

我建議您創建一個AbstractRepository實現,實現您的IRepository接口,以共享常見方法,然後從抽象類中擴展業務存儲庫實現。

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

在檢查我的系統中所有類的通用,有些類需要以不同的方式將業務對象映射到POJO。但是他們仍然需要調用add方法,是否讓所有從'AbsRepo '擴展的存儲庫都有一個add()方法來映射業務對象,並調用super.add(「mappedObject 「)'? – Duy

+0

不一定,但如果您發現您需要將POJO映射到'#add()'的實體類型,那麼我認爲您也需要使用類似的方法。爲什麼不簡單地有一個單獨的類來處理轉換,並在調用add層的代碼層中調用它,而不是在db層中添加它呢? – Naros

相關問題