Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
有没有一种聪明的方法可以通过底层DOM和JPA模型使JavaFXTreeView保持最新?_Java_Jpa_Javafx_Synchronization_Treeview - Fatal编程技术网

有没有一种聪明的方法可以通过底层DOM和JPA模型使JavaFXTreeView保持最新?

有没有一种聪明的方法可以通过底层DOM和JPA模型使JavaFXTreeView保持最新?,java,jpa,javafx,synchronization,treeview,Java,Jpa,Javafx,Synchronization,Treeview,您好,我在使用类似DOM的数据模型(使用JPA持久化)保持我的TreeView最新时遇到问题 我的代码相当冗长,因此为了更好地理解,我将其分解为一种伪代码 我的基本DOM对象类似于以下节点类: @实体 公共类节点{ @身份证 私有UUID UUID=UUID.randomUUID(); @许多酮 私有节点父节点; @OneToMany(orphanRemoving=true,mappedBy=“parentNode”,fetch=FetchType.EAGER,cascade=CascadeTy

您好,我在使用类似DOM的数据模型(使用JPA持久化)保持我的TreeView最新时遇到问题

我的代码相当冗长,因此为了更好地理解,我将其分解为一种伪代码

我的基本DOM对象类似于以下节点类:

@实体
公共类节点{
@身份证
私有UUID UUID=UUID.randomUUID();
@许多酮
私有节点父节点;
@OneToMany(orphanRemoving=true,mappedBy=“parentNode”,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
private List children=new ArrayList();
//---其他一些不相关的领域
//---其他一些不相关的方法
公共节点getParent(){
将此文件返回给父对象;
}
公共布尔addChild(节点子级){
布尔结果=假;
如果(!isCircularReference(child)){//,则检查传递的子对象是否是较远的子对象等。
结果=this.children.add(child);
}
返回结果;
}
当然Node类包含更多的内容,但我认为这与主题无关

然后我有一个视图控制器,它控制一个JAVAFX TreeView对象

公共类视图控制器{
@FXML私有树视图树;
专用节点rootNode;
ViewController(节点根){
对象。requirennull(根);
this.rootNode=root;
setupView();
}
//其他一些节点等。
私有void setupView(){
TreeItem treeRootNode=新的TreeItem(根节点)
this.tree.setRoot(treeRootNode);
fillTreeNodeWithProductNode(treeRootNode,rootNode);
}
//递归地填充节点下每个子节点的树视图
私有void fillTreeNodeWithProductNode(最终TreeItem treeNode,最终节点){
node.getChildren().forEach(子级->{
最终TreeItem childTreeNode=新TreeNode(子级);
getchildrenode().add(childrenode);
fillTreeNodeWithProductNode(childTreeNode,child);
});
}
//---添加和删除树项下树项的一些方法。
@FXML
私有void onSaveButtonPressed(){
//…简化
EntityManager em=getEntityManager();
Node oldRootNode=根节点;
rootNode=em.merge(rootNode);
compareAndRefreshTreeView(rootNode、oldRootNode);
}
}
此ViewController还处理删除和向树中添加节点元素的操作。 这里没有显示它是为了保持简单。但是:这很好。据我所知,它不会引起任何问题

棘手的一点是在使用JPA分发和管理我的节点对象时。 如果假设我在rootNode上使用
EntityManager.merge(E entity)
方法,那么它将返回此rootNode的一个新实例。 这就是给我带来麻烦的原因。 TreeView tree.getRoot仍然引用视图创建时使用的旧实例。 这意味着我必须使用
EntityManager.merge(E entity)
方法返回的新实例重新创建整个树。 此重新创建导致treeview与用户按下“保存”按钮时的外观不同(树已折叠,侧栏位置为顶部,等等) 为了更好的用户体验,我在合并之前创建了一个对包含根节点的树项的引用,然后在重新创建树视图之后,我比较两个结构,并在需要时展开新的树视图。正如sipmly在
ViewController.onSaveButtonPressed()中所示,还存储了对scollBar位置的引用。
它工作得很好,但就是感觉不对劲

所以我的问题是:肯定有更有效的方法来保持所有数据的同步吗


我希望这些代码足以理解我的问题,如果没有,请告诉我。

请(您可以硬编码后端更新/刷新)@kleopatra我理解您的请求,但是需要一段时间才能用JPA等准备好一个工作项目。重复:模拟数据库部分,这并不重要(不是真正的提交/合并,而是使用一个返回与旧版本不同的硬编码项目树的函数)-您似乎有问题的部分(至少我理解您的问题)是保持树状态(如选择/扩展)请(您可以硬编码后端更新/刷新)@kleopatra我理解你的要求,但是需要一段时间才能用JPA等准备好一个工作项目。重复:模拟数据库部分,无论如何它都不重要(不是真正的提交/合并,而是有一个返回不同于旧项目的硬代码树的函数)-你似乎有问题的部分(至少我理解你的问题)是保持树状态(如选择/扩展)