我的目标是为现有应用程序启用模式和数据迁移.
这种问题似乎已被多次提出,但我认为有不同的要求和情况.
由于我在这个领域缺乏经验,请允许我首先列出应用程序的架构和我的假设.
该应用程序是一个多用户企业桌面应用程序,具有后端服务器,可以持久保存到任何主要数据库(MySql,Postgresql,SQL Server,Oracle DB等).假设数据库是内部部署并由我们的客户维护.
使用的技术堆栈是一个相当常见的Hibernate + Spring + RMI/JMS-Combo.
目前,服务器通过以下方式完成迁移:
CREATE TABLE ...)ALTER TABLE ...)此迁移速度缓慢且仅向前.但这很简单.问题是,到目前为止,模式脚本和数据迁移中的查询一直在使用MySQL语法和功能.
请注意,通过迁移数据,我的意思是:后端服务器将数据从旧模式复制到新模式,必要时进行转换.此外,迁移过程在我们的客户端内部自动启动.意思是,我们只能控制JDBC连接,但不能直接访问数据库,也不了解正在使用的特定数据库(MySQL,SQL Server,...).
目标是用独立于数据库的迁移方案替换或扩充此迁移方案.
StackOverflow 1 2 3 4 5 6 7:回答状态使用Hibernate的内置功能.但是,文档声明这不是生产准备.此外,AFAICT,所有答案仅涉及架构迁移.
Liquibase:使用自定义DSL(在XML/JSON/YAML/etc中),仅允许数据库无关的模式迁移.
DBUnit:使用自定义XML-DSL捕获数据库状态的快照.无法重新创建架构版本1到版本2的快照.
飞路:原则上同Liquibase.但不是数据库独立的,因为SQL-Scripts用于迁移.
JOOQ:基于JDBC的Java中独立于数据库的Query-DSL.可与Criteria API相媲美,但没有JPA的缺点.原则上应该允许数据库独立的数据迁移,但是对于模式迁移没有帮助.
JPA-Query语言如HQL,JPQL,Criteria API是不够的,因为
我意识到,现在这个问题已经存在,它将被视为以意见为基础.
但是,我不一定在寻找这个问题的具体解决方案(我怀疑对于这样一个复杂的问题空间存在明确的解决方案),而是要验证我的假设.
也就是说,这是真的
对于一个简单的矢量绘图应用程序,我希望实现一个“选择框”,它是节点布局边界的图形表示。
例子:
感谢Jewelsea和他的BoundsExample,我现在对如何获取盒子的数据有了很好的了解。我正在努力解决的部分实际上是在场景上绘制盒子,以正确尊重节点上的转换的方式。
在这种情况下,正确意味着边界逻辑大小随节点缩放,但选择框的笔划保持不变。这意味着选择框随其相应的节点缩放,但笔画保持未缩放。
我可以想到实现这样一个选择框的两种通用策略。
作为我的自定义节点的属性 选择框可以是我的自定义节点的内部详细信息,其可见性绑定到节点的选定状态。在这种情况下,如果可能的话,我需要找到一种方法让节点忽略父级转换。
在透明窗格上的缩放节点顶部绘制选择框在这种情况下,在将节点的转换应用到其边界之后,我会将选择框绑定到缩放节点的布局边界。这在 JFX 中似乎不会发生(即使对于“boundsInParent”),因为您可以通过对第 122 行中的“group”应用一些缩放来快速测试示例。
带缩放的修改示例:
package application;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.effect.DropShadow;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape; …Run Code Online (Sandbox Code Playgroud) 我们在JavaFX中创建了一个小型绘画应用程序.一个新的要求出现了,我们必须警告用户,他做了一些尚未持久的更改并询问他,用户是否愿意在关闭之前先保存.
示例快照:

不幸的是,有很多不同的节点,节点可以通过多种方式进行更改,例如Polygon点可以移动.可以拖动节点本身.它们可以旋转等等.因此,在为一个Node对象的每个可能的更改触发一个极好的事件之前,我想问一下,如果有人可能知道如何简化这种方法.我很好奇,如果有任何监听器,我可以在JavaFX的场景图中监听canvas对象的任何更改.
特别是因为我只是想知道是否有任何改变,而不是真的需要知道具体的变化.
此外,我也不希望得到每个单独的事件,如简单的选择,这会导致在所选节点周围显示边框(如图中所示),这并不意味着用户必须保存他的离开前申请.
有人有想法吗?或者我真的需要为节点内的每一次更改触发事件吗?