Уверенность, что постоянство Hibernate сработало на тесте junit - PullRequest
0 голосов
/ 01 апреля 2012

Если у меня есть тестовый метод, помеченный как @Transactional, и я сохраняю сущность в БД в любой момент времени, я должен иметь возможность получить новый материал (с изменениями) в следующей строке кода, даже хотя транзакция будет затем откатываться (поведение по умолчанию для транзакционных модульных тестов), верно?

Другими словами, если у меня есть следующее:

thisPhoto.likes.add(thisUser);
thisPhoto.save(); //the hibernate session will save this instance
...
thisUser = User.get(thisUser.id) // I even take the user instance again
newPhoto = thisUser.likedPhotos.get(0); //this should already contain the new photo, right?
assertEqual(newPhoto, thisPhoto);

Представьте, что фотография и пользователь являются объектами на основе Hibernate, где все отношения установлены правильно и все.

Тем не менее, когда я добираюсь до последней строки кода, я получаю исключение, что коллекция понравившихся фотографий имеет размер 0, и нет элемента с индексом 0.

Почему? Как еще я должен проверить, что сущность сохранилась правильно?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2012

Прежде всего, вы не должны обрабатывать список, который принадлежит Photo напрямую, без вызова Photo.getLikes(). В большинстве случаев это считается плохим объектно-ориентированным стилем.

Во-вторых, для большинства доменных объектов вполне нормально вообще не разрешать редактирование своих коллекций. Вы должны попросить Photo обновить список следующим образом: Photo.addLikedUser(User). Затем вы можете заблокировать свой список для редактирования, вернув Collections.unmodifiableSet(this.likes) в методе Photo.getLikes().

Наконец, чтобы решить вашу проблему, вам, вероятно, нужно вызвать User.addLikedPhoto(Photo) в вашем методе Photo.addLikedUser(User). Я не уверен, что Hibernate сделает это за вас, особенно перед вызовом flush.

0 голосов
/ 01 апреля 2012

save не сохраняет сразу.Вы должны flush сеанс, чтобы убедиться, что изменения действительно сохраняются в базе данных.

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