另一个新手问题。我有一个名为 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,内部类方法是个好主意吗?