Я обновляю свое приложение, в настоящее время оно использует Hibernate 3 и теперь переходит на jpa-hibernate 4. У нас есть один служебный класс BaseDAO
, который используется для всех операций, связанных с базой данных, таких как executeQuery
, executeUpdate
и всех,Сеанс также управляется только там.В настоящее время, когда мы используем методы get для отображения данных или одну операцию обновления / создания / удаления, тогда мы не создаем транзакции, это делает BaseDAO
.Теперь, когда мы мигрируем в JPA, нам нужен транзакционный вызов сохраняемого вызова. Итак, я добавил @Transactional
на BaseDAO
на уровне класса, и когда я его добавляю, приложение работает нормально, но с функциональностью, где было много взаимодействия с БДэто замедлилось.Есть один отчет, который раньше занимал 1 минуту, а теперь он занимает 1,4 минуты.
Метод шаблона Hibernate
public class BaseDAO extends HibernateDaoSupport {
public List executeQueryPaging(final String hql, final Object[] params, final Integer[] pagingParam) {
List results = null;
results = getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) {
Query query = session.createQuery(hql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
query.setFirstResult(pagingParam[0]);
query.setMaxResults(pagingParam[1]);
return query.list();
}
});
return results;
}
}
Метод JPA
@Transactional
public class BaseDAO {
public List executeQueryPaging(final String hql, final Object[] params, final Integer[] pagingParam) {
Query query = entityManager.createQuery(hql);
List list = null;
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i + 1, params[i]);
}
}
if (pagingParam != null) {
query.setFirstResult(pagingParam[0]);
query.setMaxResults(pagingParam[1]);
}
list = (List) query.getResultList();
return list;
}
}