【发布时间】:2010-09-21 09:20:55
【问题描述】:
我有一个相当大的对象树结构,我坚持使用 Hibernate。这应该首先与根节点保持一致,然后是子节点,依此类推。然而这不是 Hibernate 这样做的方式,它首先持久化子元素,然后在父元素被持久化时更新子元素中的引用列。这不是最佳方式,因此我强制一对多 (JoinColum) 不为空 (nullable=false)。
现在事实证明,一切都变得更慢,慢得多。我不明白?!
【问题讨论】:
-
我认为没有足够的细节来获得任何答案。
-
我知道细节水平很低。但是我还没有那么多,并且正在努力。因此,如果我在所有一对多和多对一关系上都设置了“nullable=false”,那么所有这些都可以说,持久化需要 30 分钟。如果我删除约束但拥有相同的数据,则需要 40 秒。我还可以补充一点,我的对象图中没有循环依赖关系,它是一棵树(在具有“级联”的关系上)。
-
问题与 Hibernate 进行插入和更新的方式有关。当使用“nullable=true”(或根本不使用)时,Hibernate 将跳过插入时的外键列,并稍后使用更新语句对其进行更新。但是,如果“nullable=false”,外键将在插入中但具有不正确的值,然后由更新语句更新?!这是非常低效的,我真的很想解决一些问题(为什么在我仍然不明白的 PostgreSQL 上差异如此之大?)。
-
可能还有其他一些因素影响 hibernate 的操作插入顺序,从这个描述中不清楚。
-
A 现已成功修复此问题。如果不允许外键为空,则在持久化数据时,Hibernate 会强制采用广度优先的方法。也增加了复杂性的一件事是,这棵树并不像我想象的那样“完美”。这导致方法比我想象的要糟糕得多。我稍微放松了对一对多关系的约束,以便 Hibernate 可以按照它发现更有效的顺序(自下而上)持续存在。
标签: java hibernate postgresql jpa jboss5.x