小编Oli*_*low的帖子

数据库独立数据迁移

我的目标是为现有应用程序启用模式和数据迁移.

这种问题似乎已被多次提出,但我认为有不同的要求和情况.

由于我在这个领域缺乏经验,请允许我首先列出应用程序的架构和我的假设.

建筑

该应用程序是一个多用户企业桌面应用程序,具有后端服务器,可以持久保存到任何主要数据库(MySql,Postgresql,SQL Server,Oracle DB等).假设数据库是内部部署并由我们的客户维护.

使用的技术堆栈是一个相当常见的Hibernate + Spring + RMI/JMS-Combo.

目前,服务器通过以下方式完成迁移:

  • 在服务器启动时,它会检查最新的预期架构版本
  • 如果大于当前版本,请开始迁移到下一版本,直到current == latest:
    1. 创建新数据库
    2. 加载(整个)最新模式(SQL脚本有很多CREATE TABLE ...)
    3. 迁移数据(在Java类中使用2个JDBC-Connections到新旧模式)
    4. 加载(所有)最新约束(SQL脚本有很多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是不够的,因为

  1. 无法引用未由实体管理器映射的表.例如,连接表,元数据和审计表.
  2. 需要保留所有版本的Entity类的副本以进行映射.

我意识到,现在这个问题已经存在,它将被视为以意见为基础.

但是,我不一定在寻找这个问题的具体解决方案(我怀疑对于这样一个复杂的问题空间存在明确的解决方案),而是要验证我的假设.

也就是说,这是真的

  • Liquibase和Flyway主要关注架构迁移,数据迁移是留给读者的练习吗?
  • 为了让Flyway支持多个不同的数据库,需要为每个数据库复制迁移脚本吗?
  • 总的来说,数据库无关的数据迁移问题在企业Java中仍未解决? …

java hibernate database-migration liquibase flyway

6
推荐指数
1
解决办法
1201
查看次数

在 JavaFX 中绘制变换独立布局边界

对于一个简单的矢量绘图应用程序,我希望实现一个“选择框”,它是节点布局边界的图形表示。

例子:

例子

感谢Jewelsea和他的BoundsExample,我现在对如何获取盒子的数据有了很好的了解。我正在努力解决的部分实际上是在场景上绘制盒子,以正确尊重节点上的转换的方式。

在这种情况下,正确意味着边界逻辑大小随节点缩放,但选择框的笔划保持不变。这意味着选择框随其相应的节点缩放,但笔画保持未缩放。

我可以想到实现这样一个选择框的两种通用策略。

  1. 作为我的自定义节点的属性 选择框可以是我的自定义节点的内部详细信息,其可见性绑定到节点的选定状态。在这种情况下,如果可能的话,我需要找到一种方法让节点忽略父级转换。

  2. 在透明窗格上的缩放节点顶部绘制选择框在这种情况下,在将节点的转换应用到其边界之后,我会将选择框绑定到缩放节点的布局边界。这在 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)

scaling vector-graphics selection affinetransform javafx-8

5
推荐指数
1
解决办法
2772
查看次数

如何监听特定节点的JavaFX SceneGraph的可见更改

我们在JavaFX中创建了一个小型绘画应用程序.一个新的要求出现了,我们必须警告用户,他做了一些尚未持久的更改并询问他,用户是否愿意在关闭之前先保存.

示例快照:

画布图像

不幸的是,有很多不同的节点,节点可以通过多种方式进行更改,例如Polygon点可以移动.可以拖动节点本身.它们可以旋转等等.因此,在为一个Node对象的每个可能的更改触发一个极好的事件之前,我想问一下,如果有人可能知道如何简化这种方法.我很好奇,如果有任何监听器,我可以在JavaFX的场景图中监听canvas对象的任何更改.

特别是因为我只是想知道是否有任何改变,而不是真的需要知道具体的变化.

此外,我也不希望得到每个单独的事件,如简单的选择,这会导致在所选节点周围显示边框(如图中所示),这并不意味着用户必须保存他的离开前申请.

有人有想法吗?或者我真的需要为节点内的每一次更改触发事件吗?

javafx listener scenegraph javafx-8

2
推荐指数
1
解决办法
1495
查看次数