减少hibernate会话中的代码重复

时间:2017-08-27 03:19:06

标签: java hibernate design-patterns

我正在使用Jersey和Hibernate开发一个REST Web服务,后端使用Postgres。我有3个包,分别用于模型,资源和服务。对于服务中的每个方法,我都在复制代码:

public class Men extends Fragment {

RecyclerView my_recyclerView1;
ArrayList<Tab_1_DataActivity> tab1;
Context context;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 context = container.getContext();
 //put the rest of your code and put context in place of getContext or getActivity
   }
}

有人可以建议我如何在不重复此代码的情况下执行此操作。我正在考虑为实体模型类编写一个接口。然后将该接口传递给上面的代码。不确定这是否是最好的方法。

4 个答案:

答案 0 :(得分:1)

在任何设计模式中,都鼓励和促进使用界面。它将允许您在将来添加不同的实现/功能,减少依赖性,这只不过是抽象。

示例:

public interface StudentDao {
   public void save(Student student);
}

我们有一个实现类

@Repository
public interface StudentDaoImpl implements StudentDao {

   @Autowired  
   SessionFactory sessionFactory; 

   public void save(Student student){
      Session currentSession = sessionFactory.getCurrentSession();  
      currentSession.save(student);    
      currentSession.close();
   }
}

服务类例如:

@Service
public class StudentService {

  @Autowired
  StudentDao studentDao; 

  @Transactional  
  public void save(Student student){
      studentDao.save(student);
  }


}

完全成熟的解释取决于您的项目和要求。但是,我为您解释了一个基于注释的简单示例。

答案 1 :(得分:0)

您可以使用spring-data-jpa模块并创建extends the CrudRepository interface for your repository

的存储库界面

默认情况下,它将包含所有标准的CRUD方法,如save。大多数情况下,您不必定义实现 - Spring将为接口提供实现。对于非常复杂的存储库代码,您可以混合使用自己的java实现方法。

它还允许您在界面中定义许多查询,而无需编写任何代码。

CrudRepository提供的功能:

public interface CrudRepository<T, ID extends Serializable>
    extends Repository<T, ID> {
                                                                                                                       (1)
    <S extends T> S save(S entity);
                                                                                                                       (2)
    T findOne(ID primaryKey);
                                                                                                                       (3)
    Iterable<T> findAll();

    Long count();
                                                                                                                       (4)
    void delete(T entity);
                                                                                                                       (5)
    boolean exists(ID primaryKey);
                                                                                                                       (6)
    // … more functionality omitted.
}

答案 2 :(得分:0)

通过结合Rahul Raj's answer on DAO pattern和各种关于通用类型的建议,我设法实现了我想要的目标。

创建的实体类EntityAEntityBEntityC。创建了一个名为Object的界面,如下所示:

public interface Object<T> {
    public T addObject(Class<T> entityClass, T newObject);
} 

并用

实现
public class ObjectImpl<T> implements Object<T> {
    @Override 
    public T getObject(Class<T> entityClass, long objectId) {
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        T entity = null;
        try {
            transaction = session.beginTransaction();
            entity = session.get(entityClass, objectId);
            session.getTransaction().commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
        } finally {
            session.close();
        }
        return entity;
    }
}

现在我可以使用这个addObject方法插入不同实体的对象,如

public class EntityAService {

    public EntityAService() {
    }
    public EntityA addRedemption(EntityA entityA) {
        Object<EntityA> newEntityA = new ObjectImpl<EntityA>();
        return newEntityA.addObject(EntityA.class, newEntityA);
    }
}

HibernateUtil提供单例SessionFactory对象。通过这种方式,我可以添加任意数量的不同实体,并将其实例保存到数据库,而无需过多的代码重复。如果有人有更好的建议/意见,请告诉我。谢谢大家的想法!

答案 3 :(得分:0)

使用泛型,你可以这样做:

public static <T>T addObject(Object object, Class<T> type) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    org.hibernate.Transaction tx = null;

    try{
        tx = session.beginTransaction();
        session.save(object);
        tx.commit();
    }catch (HibernateException e) {
        if (tx!=null) tx.rollback();
        e.printStackTrace();
    }
    session.close();
    return type.cast(object);
}