2015-04-16 194 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()); 
    } 
} 

当我到达行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

在致电getRecentGames之前,请尝试在您的会话中调用flush。如果该方法正在执行自定义查询,而不是使用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()'的实现。 –