2015-04-16 133 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()'的實現。 –