2017-02-15 7 views
0

リポジトリデザインパターン(私がこれまで理解してきたもの)には、各ビジネスモデルのリポジトリがあります。HibernateとRepository Patternの複数の同様のCRUDメソッド?

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

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

は、各リポジトリは、addメソッドの基本的に重複していないだろう。私は新しいレコードをこのように保存し、Hibernateで

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

:すべてのこれらのリポジトリはIRepositoryインタフェースを実装しますか?それでは、すでに定義されているaddメソッドなどを使ってRepositoryクラスを作る方が良いのではないでしょうか?

+0

あなたには、いくつかのリポジトリを使用する場合、あなたは一般的な値を受け取り、いくつかの実装を使用している、そして、あなたはすべてのこれらのメソッドを実装する必要はありません、私のシステムの見直しの際にリポジトリインタフェース – cralfaro

答えて

1

IRepositoryインターフェイスを実装するAbstractRepositoryのインプリメンテーションを作成して、共有される一般的なメソッドに対して作成し、ビジネスレポジトリの実装を抽象クラスから拡張することをお勧めします。

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 'から拡張したすべてのリポジトリにビジネスオブジェクトをマップし、 'super.add(" mappedObject ")'? – Duy

+0

必ずしもそうではありませんが、POJOから '#add()'のエンティティタイプにマップする必要がある場合は、おそらく同様の方法を使って逆の必要性を感じるでしょう。単純に、変換を処理し、db層でそれを追加するのではなく、addを呼び出すコードの層でそれを呼び出す別のクラスを持たないのはなぜですか? – Naros

関連する問題