Nano Hash - криптовалюты, майнинг, программирование

При переносе формы Hibernate3 в Hibernate4 вложенные транзакции не поддерживаются

За неделю до того, как мы перенесли приложение с hibernate3 на hibernate4, все работало нормально в hibernate3, но после перехода на hibernate4. Я продолжаю получать сообщение вложенные транзакции не поддерживаются.

Ниже мой сервисный слой, который вызывает дао

public class LeaveApplicationService implementsSerializable,LeaveApplicationInterfaceService{
    @Autowired
    private LeaveApplicationInterfaceDao _leavApplicationInterfaceDao;
       //getter setter
    @Override
    public synchronized void clickOnAddLeaveButton(LeaveApplicationViewBean leaveApplicationViewBean) {
    SessionFactory sessionFactory=(SessionFactory) ObjectFactory.getBean("sessionFactory");
    sessionFactory.getCurrentSession().beginTransaction();


        try{
                leaveApplicationViewBean.get_employeeListObj().clear();
                leaveApplicationViewBean.get_leaveTypelist().clear();
                leaveApplicationViewBean.get_leaveApproveers().clear();
                //leaveApplicationViewBean.set_employeeListObj(get_leavApplicationInterfaceDao().getEmployeeList());
                leaveApplicationViewBean.set_leaveTypelist(get_leavApplicationInterfaceDao().getLeaveType());
                leaveApplicationViewBean.set_leaveApproveers(get_leavApplicationInterfaceDao().getLeaveApprover(CmsUtil.getSession("userId").toString()));

        }catch(Exception e){
            CmsLogger.errorLog(LeaveApplicationService.class, e);
        }finally{
            sessionFactory.getCurrentSession().close();
        }
}

Слой Дао

public class LeaveApplicationDao extends TransactionService implements Serializable,LeaveApplicationInterfaceDao{
    private static final long serialVersionUID = 6237725881698448330L;

    public List<LeaveApprover> getLeaveApprover(String userId) throws Exception {
      List<LeaveApprover> _leavApprovers=new ArrayList<LeaveApprover>();
      Iterator it=getSessionFactory().getCurrentSession().createQuery(sql.toString()).setParameter("practiceAreaId",CmsUtil.getSession("practiceAreaId").toString())                                            .setParameter("userId",userId).setCacheable(true)
                                                                                    .list().iterator();
      while(it.hasNext()){
        Object[] obj=(Object[]) it.next();
        LeaveApprover leaveApprover=new LeaveApprover();
        leaveApprover.set_approverId((String) obj[0]);
        leaveApprover.set_approverName((String) obj[1]);
        _leavApprovers.add(leaveApprover);
    }

    return _leavApprovers;
}



public List<TimeProjectCategory> getLeaveType() throws Exception{
    List<TimeProjectCategory> timeProjectCategories=new ArrayList<TimeProjectCategory>();
    Iterator it =getSessionFactory().getCurrentSession().createQuery(sql.toString()).setCacheable(true).list().iterator();
        while(it.hasNext()){
            Object[] obj=(Object[]) it.next();
            TimeProjectCategory category=(TimeProjectCategory) ObjectFactory.getBean("domainTimeProjectCategoryObj");
            category.getProjectId().set_projectId((String) obj[0]);
            category.setTimeCategory((String) obj[1]);
            category.setTimeProjectCategoryId((String) obj[2]);
            timeProjectCategories.add(category);
        }


    return timeProjectCategories;

}

}

И мой класс TransactionService

public class TransactionService{
/**
 * 
 */
private static final long serialVersionUID = 3747504246445270484L;

@Autowired
private DataSource dataSource;

@Autowired
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
    return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}


public DataSource getDataSource() {
    return dataSource;
}
public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}


}

И исключение, которое я вижу в стеке, это

Трассировка стека для кода

Мой db.xml

файл db.xml


  • Проверьте обновления, добавленные в hibernate4 in.relation.to/Bloggers/WhatsNewInHibernateCore40. 24.10.2013
  • Я не вижу обходного пути для данного кода. 24.10.2013
  • Hibernate никогда не поддерживал вложенные транзакции, и это было реализовано в Hibernate 4. Поскольку AbstractTransactionImpl раньше не существовало. Ознакомьтесь с той же проблемой, аналогичной вашей linkedin. ком/группы/ 24.10.2013
  • Опубликуйте полную трассировку стека исключения. Кроме того, ваш сервисный метод запускает транзакцию, но не фиксирует и не откатывает ее. 26.10.2013
  • Поскольку я использую только для извлечения записей, ничего не нужно фиксировать и откатывать. 26.10.2013
  • Я связал трассировку стека. Пожалуйста, помогите мне. 28.10.2013
  • Не могли бы вы опубликовать конфигурацию своей весенней транзакции? Указывали ли вы там какой-либо уровень распространения при настройке источника данных или диспетчера tx? Или, может быть, внутри вашего сервера приложений? 28.10.2013
  • Мой db.xml dropbox.com/s/j125zqndt4nwbsg/db.xml 28.10.2013

Ответы:


1

Есть две возможности:

Определенное реализацией поведение с открытыми транзакциями при закрытии сеанса:

Перед закрытием соединения убедитесь, что вы зафиксировали (или откатили, не имеет значения только для чтения) транзакцию. Hibernate Session.close() закрывает базовое соединение; и http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html#close%28%29 указывает, что поведение при открытии транзакции определяется реализацией (т. е. некоторые реализации автоматически закрывают транзакцию). транзакцию, другие могут ссылаться на соединение и удерживать его открытым).

Общая схема такова:

try {
    Transaction t = sessionFactory.getCurrentSession().beginTransaction();
    try {
        // do work
        t.commit();
    } catch (Exception e) { 
        t.rollback();
        throw e;
    }
} finally {
    sessionFactory.getCurrentSession().close();
}

Предыдущая транзакция все еще активна:

Если предыдущая транзакция все еще активна из другого места, вы можете сделать это:

Transaction t = session.getTransaction();
if (t == null || !t.isActive()) 
    t = session.beginTransaction();

// then use t (or session's current transaction, same thing)

Или, если вы не передаете Transaction:

if (session.getTransaction() == null || !session.getTransaction().isActive())
    session.beginTransaction();

// then use session's current transaction

Но вы все равно, вероятно, захотите изучить свой код, чтобы увидеть, где еще открывается транзакция в данном соединении.

28.10.2013
  • По ссылке stackoverflow.com/questions/8046662/ getCurrentSession() сделает это автоматически. Он очистит и закроет соединение. так что я не должен беспокоиться об этом. 28.10.2013
  • Я не вижу, чтобы это было написано где-либо в этой ссылке; документация JDBC понятна. Ты пробовал это? В любом случае я добавил к ответу вторую возможность. 28.10.2013
  • Я не использовал атрибут распространения транзакции spring. Итак, что вы предлагаете мне использовать. 28.10.2013
  • @JasonC может быть прав (помимо того, что идентификатор документации JDBC ясен, этот пост на форуме просто слишком стар). Так что просто попробуйте и сообщите нам ответ. 30.10.2013
  • Если этот совет не помогает, попробуйте обновить/понизить версию спящего режима до другой дополнительной версии. 30.10.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..