2

另一个新手问题。我有一个名为 Services 的 RDBMS 表,声明如下:

CREATE CACHED TABLE Services ( 
    serv_id      BIGINT        GENERATED ALWAYS AS IDENTITY (START WITH 100) PRIMARY KEY,
    enc_id       BIGINT        REFERENCES Encounters ( enc_id ),
    prov_id      INTEGER       REFERENCES Providers ( prov_id ),
    DoS          DOUBLE        DEFAULT 0.0 NOT NULL,
    DoP          DOUBLE        DEFAULT 0.0 NOT NULL,
    DoR          DOUBLE        DEFAULT 0.0 NOT NULL
);

在处理Service对象对这个表的持久化时,我写了一个Java类,将每个SQL字段映射到其对应的Java类型字段,即Class Service有相同的六个字段。因为我正在开发一个在 JavaFX 应用程序中使用此表的应用程序,所以我对每种类型都使用了 JavaFX 属性字段,例如。

Class Service {
    LongProperty serv_id = new SimpleLongProperty();
    :
}

这是我现在想知道的问题...

我的 RDBMS 表是高度规范化的,所以我几乎从不处理这个级别的实际数据库表。在我可以将我的 Services 表中的信息呈现给用户之前,我执行了这个查询:

SELECT s.serv_id, r.rx_id, p.prov_id, s.*, sr.*, r.*, 
    p.lastName || ', ' || p.firstName AS provName" +
        FROM Services AS s
        INNER JOIN Service_RXs AS sr USING ( serv_id )
        INNER JOIN RXCodes AS r USING ( rx_id )
        INNER JOIN Providers AS p USING ( prov_id )
        WHERE s.enc_id = ?
        ORDER BY s.DoS DESC;

该结果集有 11 列,大约是 Services 表中列数的两倍。此结果集中的信息用于 TableView。因为最好的做法是有一个代表 TableView 数据模型的类,所以在我看来,我有三个选择:

  • 选择 1

我可以将一个类用于所有目的,即我可以扩展 Service 类来表示我的持久层(即 JDBC)和 JavaFX GUI API 所需的功能。我不喜欢这个解决方案。这意味着我不得不担心只保留对象的一部分,我必须有在正确的时间获取所有非规范化数据的方法,而且我不得不放弃考虑我的班级的吸引人的概念作为一个角色。

  • 选择 2

我可以编写完全独立的类,一个用于数据库表,另一个用于 TableView 的数据模型。我不认为这有什么问题,但它似乎也会带来一定数量的重复负担。

  • 选择 3

我可以在 Service 类中编写一个内部类,比如 Service.Extended,它表示相应 Service 对象的非规范化形式。乍一看,这对我来说听起来是一个很好的解决方案。它允许我保持对象之间的目的分离。内部类对象也将能够访问封闭类中所需的字段,从而避免重复。我想我可以使用静态工厂方法轻松地为 ObservableList 创建 JavaFX 数据模型对象,该方法将在代码中干净地创建新的 Service.Extended 对象。

我不可能是第一个遇到同样问题的人。如果我可能会问,其他人在尝试将规范化数据集适应 GUI 表示层时采用了哪些解决方案?这是 Hibernate/JPA 提供帮助的那种事情吗?如果我坚持使用 JDBC,内部类方法是个好主意吗?

4

1 回答 1

3

从 UI 开始工作怎么样?我的意思是:

  • 设计 UI 来做你需要它做的事情。
  • 使用您的 JavaFX 属性创建一个支持类(模型)。
  • 编写 DAO 以将模型的属性存储在表中。

通过这样做,您只需编写您真正需要的代码,而无需担心抽象。虽然 DAO 将数据库设计的复杂性反映到您尝试解决的问题 1:1。

最好和最简单的解决方案是最直接的,具有最少的代码、最少的类和最少的第 3 方依赖项。

还要记住在后台线程中运行数据库操作是架构的关键部分。不应从其他线程访问 JavaFX 属性。试图改造这对我来说是一个真正的痛苦。

于 2013-04-06T19:17:22.313 回答