java - Spring Hibernate 在测试中保存实体不持久

标签 java spring hibernate jpa spring-test

@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);
    }
}

由于我不熟悉的某些分离实体原因,持久方法会引发异常。

最佳答案

在调用 getRecentGames 之前,尝试在 session 中调用 flush。如果该方法正在执行自定义查询,而不是使用 Hibernate 的 session 方法之一,那么它将直接针对数据库 - 但由于您的 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

关于java - Spring Hibernate 在测试中保存实体不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29687730/

相关文章:

java - 使用 ActimeMQ 和 Spring Consumer 通过 mqtt 发送和接收图像文件

java - 从非托管bean访问DAO服务方法

java - 在java代码中添加 boolean 值来检查表状态条件

Java匿名内部类

java - 如何使用三个变量检查​​两个构造函数是否彼此相等?

java - Eclipse Java - Android - 未找到源

java - 哪个集合 - 每个操作的拆分器正在迭代?

java - Spring 配置 - 初始化代码的最佳实践

java - 类中的构造函数不能应用于 Spring Boot Controller 的给定类型

java - hibernate 搜索 : How to update an index by two Spring(JVM) processes?