Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在数据库中保存树结构_Java_Mysql_Database_Hibernate_Tree - Fatal编程技术网

Java 在数据库中保存树结构

Java 在数据库中保存树结构,java,mysql,database,hibernate,tree,Java,Mysql,Database,Hibernate,Tree,我使用Hibernate/Spring和MySQL数据库进行数据管理 目前,我在JTable中显示一个树结构。一棵树可以有几根树枝,反过来一根树枝也可以有几根树枝(最多九层),或者有叶子。最近,只要我想在更深层次上创建新分支,我就会遇到性能问题 此时,分支具有其父级的外键。domainobject可以通过调用getParent()访问其父对象,这将返回父分支。级别越深,创建新分支所需的时间就越长 创建新分支的微基准结果如下所示: 1级:32毫秒。 3级:80毫秒。 第9级:232毫秒 显然,这是

我使用Hibernate/Spring和MySQL数据库进行数据管理

目前,我在JTable中显示一个树结构。一棵树可以有几根树枝,反过来一根树枝也可以有几根树枝(最多九层),或者有叶子。最近,只要我想在更深层次上创建新分支,我就会遇到性能问题

此时,分支具有其父级的外键。domainobject可以通过调用getParent()访问其父对象,这将返回父分支。级别越深,创建新分支所需的时间就越长

创建新分支的微基准结果如下所示:

1级:32毫秒。 3级:80毫秒。 第9级:232毫秒

显然,这是由水平(即父母人数)造成的。所以我想问,是否有任何附件可以解决这类问题。我不明白为什么Hibernate在创建新分支时需要了解整个对象树(根之前的所有父对象)。但据我所知,这可能是创建新分支时延迟的唯一原因,因为分支与任何其他对象没有任何其他关系

我将非常感谢任何解决办法或建议

问候,
我不知道Hibernate如何在内部处理这个问题。但是,在数据库中存储树结构有不同的方法。对于在树上执行的许多查询来说,一种非常有效的方法是使用“”方法,但这基本上会产生您所看到的性能问题(例如,昂贵的插入)。如果您需要快速插入或删除,我会使用您拥有的,例如一个简单的父ID,并尝试查看Hibernate一直在做什么。

如果您不需要在SQL中报告数据,您可以将JTable序列化到数据库中(可能使用类似的方法)。这样,您就不必担心处理树的昂贵数据库查询。

基本上您有某种多对一关系结构,对吗? 在hibernate中,所有这些都依赖于映射。调整映射,使用java.util.Set从父对象到子对象使用一对多关系

不要使用ArrayList,因为列表是有序的,所以hibernate将只为该顺序添加额外的列

还要检查你的懒惰属性。如果您加载父对象,并且在其子对象集属性上设置了lazy=“false”,则其所有子对象都将从DB加载,这可能会影响性能

还要检查子级的“反向”属性。如果子表中的inverse为true,则意味着您可以单独管理子实体。否则,您必须仅使用父级来执行此操作

谷歌搜索反向,它肯定会帮助你


谢谢。

您可以做的一件事是在MySQL中使用XML支持。这将为您提供支持层次结构的本地能力。我从来没有在MySQL中使用过XML支持,所以我不知道它是否像其他DBMS那样功能齐全(我知道SQL Server和DB2有很好的支持,我猜可能是Oracle也有)。

注意,我从未使用过hibernate,所以我不知道您是否可以使用它,或者在这种情况下您是否必须编写自己的DB代码(我猜,您将编写自己的查询).

对于大型树来说,这将非常昂贵,因为每次更新时都必须序列化整个内容,即使只需要第一级节点,也必须获取整个内容。不幸的是,我必须报告很多,因此我无法使用它。感谢您的详细回答。U是对的,关系是用集合一对多声明的。首先,我试着专注于我的映射。谢谢你的提示。我查一下你所说的所有房产。谢谢,我希望它对你有用。冬眠总是很棘手,让我们困惑……:)我也读过关于嵌套集的文章。不幸的是,我需要快速更改结构的能力,所以我不再关注它,因为像u已经说过的嵌套集使结构更改非常昂贵,但对于读取命令来说非常好。您使用id而不是对象的想法很有趣。我觉得这有点不对,但可能值得一试,因为hibernate当时不应该能够解析整个层次结构。所以谢谢你的帮助!我更愿意在我的数据库管理系统上保持独立,但如果我看不到任何其他机会,我也会尝试研究这一点。我还没听说过,但很有意思。我们也要研究一下!非常感谢。我的openId注册终于成功了。我会随时通知你,哪种解决方案对我最有效,并对你的帮助给予评价。谢谢大家。