【问题标题】:Spring Hibernate Saving Entities in Test Not PersistingSpring Hibernate 保存测试中的实体不持久
【发布时间】: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&lt;Game&gt; 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


【解决方案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

【讨论】:

  • 由于无法刷新,请提供getRecentGames()的实现。
猜你喜欢
  • 2011-09-22
  • 2013-03-13
  • 2018-05-01
  • 2015-02-13
  • 2021-06-26
  • 2012-07-27
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
相关资源
最近更新 更多