【发布时间】:2015-04-16 23:33:06
【问题描述】:
@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 会打印出所有的插入语句。不幸的是,当游戏被检索时,我插入的游戏都没有被检索到。有没有办法找回那些游戏?也许一个更好的问题是我如何将这些插入放在他们自己的事务中,以便将它们持久化以供后续方法使用?
这是 GameDao 扩展的 AbstractDao:
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);
}
}
persist 方法由于一些我不熟悉的分离实体原因引发异常。
【问题讨论】:
-
你能展示一下gameDao.save()方法吗?
-
@Bruno_Ferreira 添加了保存方法
-
用户拥有 EntityManager,但通过提取 Session 并在其上执行(等效)方法而不必要地抛弃了可移植性?
-
请提供您
GameDao的源代码,因为我们需要查看配置(即@Transactional等注解的存在和配置)、事务划分、实现细节等。否则,我们只是在玩猜谜游戏。
标签: java spring hibernate jpa spring-test