我正在使用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
}
}
有人可以建议我如何在不重复此代码的情况下执行此操作。我正在考虑为实体模型类编写一个接口。然后将该接口传递给上面的代码。不确定这是否是最好的方法。
答案 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和各种关于通用类型的建议,我设法实现了我想要的目标。
创建的实体类EntityA
,EntityB
和EntityC
。创建了一个名为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);
}