метод save - не сбрасывает сессию после возникновения исключения - PullRequest
13 голосов
/ 14 марта 2011
public class SoftwareTest extends UnitTest {

    @Before
    public void setup() {
        Fixtures.deleteAll(); // will fail if comment that. why?????
    }

    @Test
    public void createSoftwareWithNullAuthor()  {

       // when author is null

       Author nullAuthor = null;

       Software software = new Software("software1", "description1", nullAuthor);
       try {
         software.save();
         fail("author should not be null");
       } catch (PersistenceException ex) {
       }

    }


    @Test
    public void createSoftwareWithOkAuthor()  {
       // when author is ok
       Author okAuthor = new Author("author1", "email1").save(); // ERROR HERE!

       Software software2 = new Software("software2", "description2", okAuthor);
       Software savedSoftware = software2.save();
       assertNotNull(savedSoftware);
       assertEquals(savedSoftware, software2); 

       assertNotNull(savedSoftware.author);
       assertEquals(okAuthor, savedSoftware.author);
    }
}

при раскомментировании строки с Fixtures.deleteAll() мы получим исключение en во втором методе - createSoftwareWithOkAuthor() при save() авторе. Почему это произошло?

org.hibernate.AssertionFailure: null id in models.Software entry (don't flush the Session after an exception occurs)
  at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:82)
  at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190)
  at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147)
  at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:240)
  at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
  at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
  at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)

Ответы [ 3 ]

11 голосов
/ 15 мая 2013

Из-за ошибки:

org.hibernate.AssertionFailure: null id в models.Software записи (не очищайте Session после возникновения исключения)

Мы можем видеть, что исключение сеанса произошло до .Точка, в которую выдается этот org.hibernate.AssertionFailure, не является точкой возникновения ошибки.

То есть: Что-то подавляет исходное исключение.

Так что ищите другиевозможные точки ошибки.save() или saveOrUpdate(), возможно, пытается сохранить сущность с полем null, где в таблице столбец NOT NULL.

В моем случае real исключение имело место внутри блока try/catch {}, где catch подавил исключение (не перебрасывал и не предупреждал меня об этом).

8 голосов
/ 14 марта 2011

похоже, проблема в том, что Hibernate вызывает исключение (поэтому текущая транзакция становится недействительной), но затем вы пытаетесь продолжить выполнение большего количества операций в этом сеансе.

Правильный способ сделать это -разделите тест, который вы используете, на 2, одну часть для тестирования нулевых авторов и одну для тестирования с допустимым автором.

В рабочем коде (скажем, в контроллере) вам потребуется перезапустить операцию (закрытьтранзакции, перезапустите процесс), чтобы иметь возможность продолжить.Но, учитывая то, как play управляет транзакциями, нормальным поведением будет то, что после ошибки вы просто вернетесь с сообщением об ошибке пользователю.

1 голос
/ 10 марта 2017

Может быть, кто-то повторил бы мою ошибку:

Я тоже сталкивался с этой проблемой. В моем случае проблема произошла, потому что я установил column type integer и попытался записать long value. После изменения типа column он начинает работать.

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