2015-04-16 1 views
0
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {HibernateConfigTest.class}) 
@Transactional 
@Sql(scripts = {"api_routes.sql", 
       "profile.sql", 
       "status.sql", 
       "user.sql", 
       "game_token.sql", 
       "game.sql", 
       "message.sql"}, 
    config = @SqlConfig(transactionMode = ISOLATED), 
    executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) 
@Sql(scripts = "delete_data.sql", 
    executionPhase = ExecutionPhase.AFTER_TEST_METHOD) 
public class GameDaoTest { 
    @Autowired 
    private GameDao gameDao; 

    @Test 
    public void getGetRecentGames() { 
     Game game = null; 
     for (int i = 0; i < 1000; i++) { 
      game = new Game(i + 1000); 
      game.setStartedAt(DateUtils.getCurrentUTCDate()); 
      gameDao.save("game", game); 
     } 

     List<Game> recentGames = gameDao.getRecentGames(1000); 
     assertNotNull(recentGames); 
     assertEquals(1000, recentGames.size()); 
    } 
} 

Когда я добираюсь до строки List<Game> recentGames = gameDao.getRecentGames(1000);, hibernate распечатывает все инструкции вставки. К сожалению, когда игры восстанавливаются, ни один из вставленных мной не извлекается. Есть ли способ получить эти игры? Может быть, лучший вопрос заключается в том, как поместить эти вставки в свою собственную транзакцию, чтобы они сохранялись для последующих методов?Весенний спящий режим Сохранение объектов в тесте не сохраняется

Вот AbstractDao, что GameDao распространяется:

public class AbstractDao { 

    @PersistenceContext 
    protected EntityManager entityManager; 

    protected Session getSession() { 
     return entityManager.unwrap(Session.class); 
    } 

    public void save(Object entity) { 
     getSession().save(entity); 
    } 

    public void save(String entityName, Object entity) { 
     getSession().save(entityName, entity); 
    } 

    public void persist(Object entity) { 
     getSession().persist(entity); 
    } 
} 

упорствовать метод вызывает исключение для некоторой отдельной причины лица, что я не знаком с.

+0

Не могли бы вы показать метод gameDao.save()? –

+0

@Bruno_Ferreira добавил метод сохранения –

+0

У пользователя есть EntityManager, но выбрасывает переносимость бесполезно, извлекая сеанс и выполняя (эквивалентные) методы на нем? –

ответ

1

Попробуйте позвонить flush на ваш сеанс перед вызовом getRecentGames. Если этот метод выполняет пользовательский запрос, в отличие от использования одного из методов сеанса Hibernate, он идет непосредственно против базы данных, но поскольку ваш save еще не синхронизирован с базой данных, данных там нет. Вам действительно не нужно делать истинный коммит, пока Hibernate может видеть данные.

for (int i = 0; i < 1000; i++) { 
    game = new Game(i + 1000); 
    game.setStartedAt(DateUtils.getCurrentUTCDate()); 
    gameDao.save("game", game); 
} 
gameDao.flush(); // calls getSession().flush() 

List<Game> recentGames = gameDao.getRecentGames(1000); 
// call assert methods as needed 
+0

Я пробовал это, и это не сработало. –

+0

Поскольку промывка не работает, предоставьте нам реализацию для 'getRecentGames()'. –