当前位置: 首页 > 面试题库 >

Hibernate运行不需要的更新语句

司健柏
2023-03-14
问题内容

我有本机查询要运行:

String sqlSelect =
"select r.id_roster as id, " +
                    "count(roster_cat.id_category), " +
            "       sum(case when roster_cat.id_category IN ( :categoryIds)                       then 1 else 0 end) as counter " +
            "from roster r " +
            "inner join roster_sa_categories roster_cat " +
                "on r.id_roster = roster_cat.id_roster " +
            "where r.day = :dayToLookFor " +
                "and r.id_shop = :idShop " +
            "group by r.id_roster " +
            "having count(roster_cat.id_category) = :nrCategories " +
                "and count(roster_cat.id_category) = counter" ;

    Query selectRostersQuery = entityManager.createNativeQuery(sqlSelect);

    selectRostersQuery.setParameter("categoryIds", Arrays.asList(categoryIds));
    selectRostersQuery.setParameter("dayToLookFor", day.toString());
    selectRostersQuery.setParameter("idShop", shopId);
    selectRostersQuery.setParameter("nrCategories", categoryIds.length);

    List<Integer> rosterIds =  new ArrayList<>();

    List<Object> result = (List<Object>) selectRostersQuery.getResultList();

出于某种原因,Hibernate选择在执行选择之前进行更新,这确实干扰了我的数据

     Hibernate: /* update domain.Roster */ update roster set day=?,     employee_count=?, interval_end=?, interval_start=?, id_shop=? where id_roster=?
     Hibernate: /* update Roster */ update roster set day=?, employee_count=?,  interval_end=?, interval_start=?, id_shop=? where id_roster=?
     Hibernate: /* dynamic native SQL query */ select r.id_roster as id,   count(roster_cat.id_category),sum(case when roster_cat.id_category IN ( ?) then 1 else 0 end) as counter from roster r inner join roster_sa_categories 
roster_cat on r.id_roster = roster_cat.id_roster where r.day = ? and r.id_shop = ? group by r.id_roster having count(roster_cat.id_category) = ? and count(roster_cat.id_category) = counter

任何帮助将不胜感激,谢谢


问题答案:

您所描述的正是Hibernate的FlushMode.AUTO含义。

执行查询时对持久性上下文(1LC)的任何修改都将在执行查询之前自动清除,以确保数据库返回的结果与内存中修改所缓存的结果匹配。

如果查询将返回您要查看其更新的实体,则您可能应该重新评估您的操作,确保查询在更新之前触发以避免刷新操作,这可能会非常昂贵,具体取决于持久性上下文中实体的数量。

如果您 完全确定 相关查询不会返回您看到的刷新更改,则可以始终通过手动设置刷新模式来强制查询不引起刷新:

Query query = session.createQuery( ... );
query.setFlushMode( FlushMode.COMMIT );
List results = query.list();

但是只有在您确定查询不会再读取未提交的更改时才执行此操作,因为这可能会导致很多问题,并导致长时间的调试会话,以了解为什么应用程序无意间丢失了更改。



 类似资料:
  • 我使用struts2和hibernate创建了一个应用程序,该应用程序将excel文件上传到数据库中,并执行其他CRUD操作。然而,现在出现了一个更改要求,用户应该能够从UI控制数据库模式,这意味着每当excel文件在数据库中有新列时,用户应该能够通过用户界面动态添加新列。 我不知道如何才能做到这一点,因为更新数据库仍将保持实体类不变。 为了说明这个问题,请考虑以下情况:我有一个员工的ab exc

  • 我正在上Java课程的第三周。我正在做一个下星期要交的课堂作业。使用控制台作为输出,我可以毫无问题地完成分配,这是可以接受的。然而,教授也建议我们研究JTextArea,并考虑将其用于我们的程序输出。 我从一个教程中找到了一些代码,并且能够至少得到一个文本块来显示我要显示的第一行文本。但是在我编写实际程序时,我需要随着程序的进展继续向文本块添加额外的行。

  • 问题内容: 我开发了一个使用GoogleMap的应用程序。我刚刚在Eclipse中更新了Android插件(带有Android L库),并重新导入了GooglePlayService库等。 因此,我重新编译后,在手机(4.4.2中的Sony Xperia Z),GenyMotion Emulator(4.4.2),Nexus 7(4.4.2)上都可以正常工作。但是,它不能在两个Samsung Ga

  • 我已经更新了我的应用程序,使用v2.1.0(从早期的2.0.1版本)的android play计费库,我不再收到购买更新完成一个悬而未决的购买。 我构造了计费客户端,将侦听器设置为当前类,该类实现了: 然后我启动购买,并使用“几分钟后慢测试卡批准” 我的监听器在这之后被调用,表明购买正在等待: 然而,当购买完成时,这个监听器不会被调用。我让应用程序打开,我在通知栏中看到播放商店的通知,说购买成功。

  • hibernate文档中说:“如果您希望利用运行时代理生成,那么至少应该使用包可见性来定义构造函数。”。我在hibernate文档中读到,hibernate可以增强字节码而不是代理创建(hibernate 5.x)。在任何情况下,它都可以用这种新方法代替代理创建?在哪些情况下需要生成运行时代理?

  • 问题内容: 我是处理这么多数据(2000万行)的新手,而且我不知道我对查询持续时间的期望是什么: 没有现场索引。这段陈述花了25分钟。数据库设置为简单恢复。25分钟似乎太长了吗?该表有9列,其中小数据类型<50 varchar。 问题答案: 如果您在一个事务中更新了2000万行,那么您的时间完全由IO子系统决定:您拥有哪种驱动器,磁盘文件的布局等等。如果RAID 40中有40个心轴,其中有4个平衡