3

如果有人已经回答了这个特定的问题,但我还没有找到我的问题的答案,那么请提前抱歉。

我正在开发一个应用程序(不,我不能提供代码,因为它是一份工作,所以我很抱歉那个),它使用 DAO 和 Hibernate 和 POJO 以及所有用于通信和写入数据库的东西。假设我在调用 Session.flush() 时没有大量数据要检查,这对于应用程序来说效果很好。话虽如此,有一个页面,用户可以在其中向产品添加任意数量的项目,并且有一个特殊情况,其中有 25 个项目。每个项目大约有 8 个字段,它们都存储在数据库中。当我调用刷新时,它确实将所有内容保存到数据库中,但需要 FOREVER 才能完成。我打电话的三行是:

merge(myObject);
Session.flush();
Session.refresh(myObject);

我已经尝试了许多不同的组合来解决这个问题和许多不同的解决方案,所以回来说“不要使用flus()”并没有太大帮助,因为 saveOrUpdate() 和其他休眠会话没有t 似乎工作。我能想到的唯一解决方案是废弃整个项目(我们得到的代码是继承的,至少可以说写得不好),或者告诉用户社区接受它。

我对 Hibernate API 的理解是,如果你想将数据写入数据库,它会对每个项目进行检查,如果有差异,它会创建一个更新查询队列,然后运行查询。似乎每次都在更新此数据,因为即使其他值未更改,我的数据库中的“DATE_CREATED”列也是不同的。

我想知道是否有另一种方法可以防止提交如此大量的数据,或者是否有一种方法可以从“检查”休眠中排除该特定列,所以如果我只进行更改,我就不必提交所有 25 个项目到 1?

提前致谢。

麦克风

4

2 回答 2

2

好吧,除非您使用StatelessSession,否则您真的无法避免休眠中的脏检查。当然,您会因此失去很多功能(延迟加载等),但这取决于您做出这个决定。

另一种选择:我肯定会尝试在您的实体中使用dynamic-update=true 。喜欢:

@Entity(dynamicUpdate = true)
class MyClass

使用它,Hibernate 将只更新修改后的列。在具有少量列的小表中,它不是那么有效,但在您的情况下,它可能有助于加快整个过程,因为您无法避免使用常规 Hibernate 会话进行脏检查。更新几列而不是整个对象总是更好,对吧? 这篇文章更多地讨论了动态更新属性。

于 2012-08-24T18:00:55.880 回答
1

我想知道是否有另一种方法可以防止提交如此大量的数据,或者是否有一种方法可以从“检查”休眠中排除该特定列,所以如果我只进行更改,我就不必提交所有 25 个项目到 1?

我会分析应用程序以确保刷新时的脏检查实际上是问题所在。如果您发现确实是这种情况,您可以使用 evict 来管理会话大小。

session.update(myObject);
session.flush();
session.evict(myObject);
于 2012-08-24T17:47:09.893 回答