Многошаговая транзакция в спящем режиме - PullRequest
1 голос
/ 18 января 2011

У меня мало проблем с многошаговой трансформацией в спящем режиме.Это то, что я делаю.

Один из моих методов DAO

  1. Создает новую запись в таблице A и получает сгенерированный Oracle первичный ключ.
  2. Обновляет aстрока в таблице B с первичным ключом, полученным на шаге 1

Код выглядит примерно так:

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public Object myDAOMethos(...){
    ....
    getHibernateTemplate().execute(
new HibernateCallback<Long>() {
 public Long doInHibernate(Session session)
   throws HibernateException, SQLException {
  // Create a new record in table A
  session.save(objA);

  final long pKey = objA.getId();

  // Update the row in table B
  org.hibernate.Query query = session
      .getNamedQuery("updateBQuery").setLong("idB",pKey... 
   query.executeUpdate();
   }
  }
  return true;
 }
});
}

Метод связан с преобразованием.

Моя проблема: все работает нормально, когда я запускаю этот код на Tomcat.Но когда я пытаюсь выполнить для этого тестовый пример junit, обновление таблицы B никогда не происходит.Хотя я вижу обновление SQL на выходе консоли (hibernate.show_sql = true).Никаких исключений тоже!только вставка имеет место, и это все.

Не уверен, что здесь происходит!есть идеи!?

С уважением, -J

Ответы [ 2 ]

0 голосов
/ 18 января 2011

спасибо за ответ. вы правы.

Пока вы будете публиковать этот ответ, я понял, в чем проблема, и попробовал это, сработало !!

Это пункт 2 в вашем посте. По сути, сам тестовый случай junit использует «AbstractTransactionalJUnit4SpringContextTests» и управляет фиксацией / откатом БД после теста через @Rollback. В общем, данные, которые я пытался обновить, изначально не создавались. Я все еще удивлен, что я не увидел никаких ошибок на консоли !!

Я принимаю ваш ответ как правильный. Спасибо за тонну!

-J

0 голосов
/ 18 января 2011

Несколько вещей могут быть не правы

  1. Подозрительно, что вы обновили внешний ключ для вашей первой сущности вручную; hibernate должен сделать это для вас, если вы правильно настроите свои отношения.

  2. Как настроен ваш тестовый класс? Вы откатываете данные в какой-то момент, чтобы тесты были прозрачными? Я имею в виду, что если вы видите SQL, но затем в своем тесте вы не видите данные, вы пытаетесь получить доступ к своим данным в неподходящее время для тестирования - либо данные не были зафиксированы, или данные уже откатаны (если вы откатываетесь). Одна вещь, которую вы, возможно, захотите попробовать, это отключить передачу и запустить тест. Обратите внимание, что вам придется очистить данные вручную, но в нем должно быть указано, является ли проблема с конфигурацией tx в тесте.

В Spring есть несколько базовых тестовых классов, которые управляют транзакциями и откатывают данные для вас ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...