如果有人已经回答了这个具体问题但我还没有找到我的问题的答案,请提前抱歉。所以这里有。
我正在开发一个应用程序(不,我不能给出一份工作代码,所以我很抱歉),它使用DAO和Hibernate以及POJO和所有这些东西进行通信和写入数据库。这适用于应用程序,假设我在调用Session.flush()时没有大量数据要检查。话虽如此,有一个页面,用户可以在其中添加任意数量的项目,并且有一个特定的情况,其中有25个项目。每个项目大约有8个字段,它们都存储在数据库中。当我调用flush时,它会将所有内容保存到数据库中,但需要FOREVER才能完成。我打电话的三条线是:
merge(myObject);
Session.flush();
Session.refresh(myObject);
我已经尝试了许多不同的组合来解决这个问题和许多不同的解决方案所以回来并说“不要使用flus()”对saveOrUpdate()和其他hibernate没有多大帮助会议似乎不起作用。我能想到的唯一解决方案是废弃整个项目(我们得到的代码是继承的,编写得很差,至少可以说)或告诉用户社区将其搞砸。
我从Hibernate API的理解是,如果要将数据写入数据库,它会对每个项目运行检查,如果存在差异,则会创建更新查询队列,然后运行查询。好像这个数据每次都在更新,因为即使其他值没有改变,我数据库中的“DATE_CREATED”列也是不同的。
我想知道的是,是否有另一种方法可以防止如此大的数据提交或者从“检查”hibernate中排除特定列的方式,所以如果我只是我不需要提交所有25个项目改变为1?
提前致谢。
麦克
答案 0 :(得分:2)
好吧,除非你使用StatelessSession,否则你真的无法避免在休眠中进行脏检查。当然,你失去了许多功能(延迟加载等),但是你可以做出这个决定。
另一种选择:我肯定会尝试在您的实体中使用 dynamic-update = true 。像:
@Entity(dynamicUpdate = true)
class MyClass
使用它,Hibernate将仅更新修改的列。在没有列的小表中,它不是那么有效,但在您的情况下,它可以帮助使整个过程更快,因为您无法避免使用常规Hibernate会话进行脏检查。更新几列而不是整个对象总是更好,对吧? This post详细介绍了动态更新属性。
答案 1 :(得分:1)
我想知道的是,是否有另一种方法来防止这种情况发生 大量提交数据或排除该特定列的方法 从“检查”hibernate这样做,所以我不必提交所有25项 如果我只改变1?
我会分析应用程序以确保对flush的脏检查实际上是问题。如果您发现确实如此,您可以使用evict来管理会话大小。
session.update(myObject);
session.flush();
session.evict(myObject);