2017-02-15 74 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

相关问题