Java Hibernate只执行查询8次

Java Hibernate只执行查询8次,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我认为我的JUnit测试将比我用文字更好地解释这一点 @Test public void query8times(){ for(int i=0; i<15; i++){ ProspectoRadarQueryBuilder prqb = new ProspectoRadarQueryBuilder("jardeu"); List<Object[]> prospectosNotas = (List<Object[]>)

我认为我的JUnit测试将比我用文字更好地解释这一点

    @Test
public void query8times(){

    for(int i=0; i<15; i++){
        ProspectoRadarQueryBuilder prqb = new ProspectoRadarQueryBuilder("jardeu");
        List<Object[]> prospectosNotas = (List<Object[]>) genericFilterDao.executeSQL(prqb.buildQuery());   
        System.out.println("------------------------------------- "+i);
    }
}
现在让我们看看源代码

public List<?> executeSQL(String sql) {
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();

    Session hibernateSession = entityManager.unwrap(Session.class);
    Query q = hibernateSession.createSQLQuery(sql);

    return q.list();
}

所以,我使用的是Spring数据。。。有什么问题吗?

您不应该只创建一个EntityManager吗

EntityManager entityManager = entityManagerFactory.createEntityManager();

^line应该在executeSQL方法之外。

是的,正如adarshr所说,我只创建了一个entityManager。但这不是问题所在。 我忘记提交事务并关闭实体管理器

这是最终结果:

 public List<?> executeSQL(String sql) {
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();

    Session hibernateSession = entityManager.unwrap(Session.class);
    Query q = hibernateSession.createSQLQuery(sql);

    List<?> list = q.list();

    entityManager.getTransaction().commit();
    entityManager.close();

    return list;
}
公共列表执行sql(字符串sql){ EntityManager EntityManager=EntityManager工厂。createEntityManager(); entityManager.getTransaction().begin(); Session hibernateSession=entityManager.unwrap(Session.class); QueryQ=hibernateSession.createSQLQuery(sql); List=q.List(); entityManager.getTransaction().commit(); entityManager.close(); 退货清单; }
您是如何运行测试的?我不敢相信您最初的查询被命名为
query8times
是巧合。这让我相信您可能在某个地方缓存了一个测试类。为了确保这一点,请让它打印“Testing”+n+“times”并在for循环中使用该n。我怀疑您使用的类文件是在更改
query8times
方法之前编译的。当您使用eclipse时,可能会出现这种情况,并且自动构建被关闭。您应该将其作为注释或对原始问题的编辑发布,因为这不是答案。
Hibernate: select * from com_campo
------------------------------------- 0
Hibernate: select * from com_campo
------------------------------------- 1
Hibernate: select * from com_campo
------------------------------------- 2
Hibernate: select * from com_campo
------------------------------------- 3
Hibernate: select * from com_campo
------------------------------------- 4
Hibernate: select * from com_campo
------------------------------------- 5
Hibernate: select * from com_campo
------------------------------------- 6
Hibernate: select * from com_campo
------------------------------------- 7
EntityManager entityManager = entityManagerFactory.createEntityManager();
 public List<?> executeSQL(String sql) {
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();

    Session hibernateSession = entityManager.unwrap(Session.class);
    Query q = hibernateSession.createSQLQuery(sql);

    List<?> list = q.list();

    entityManager.getTransaction().commit();
    entityManager.close();

    return list;
}