另一个新手问题。我有一个声明这样的一个关系型数据库的表称为服务:普通Java持久性和JavaFX表示层:类设计的方法?
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
);
当反对这个表,我写的每一个SQL字段映射到相应的Java类型的Java类服务的持续性交易字段,即班级服务具有相同的六个字段。因为我正在开发一个在JavaFX应用程序中使用此表的应用程序,所以我已经为每种类型使用了JavaFX Property字段,例如。
Class Service {
LongProperty serv_id = new SimpleLongProperty();
:
}
这里是我现在想知道...
我的RDBMS表是高度标准化的问题,所以我几乎从来没有处理在这个水平上实际的数据库表。之前,我可以介绍我的服务表给用户的信息,我执行此查询:
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列或只是服务表列的约两倍。来自这个结果集的信息被用于TableView。因为它是有它表示的TableView数据模型的类的最佳实践,在我看来,我有三种选择:
- 选择1
我可以用一个类所有目的,即我可以扩展Service类以表示我的持久层(即JDBC)和JavaFX GUI API所需的功能。我不喜欢这个解决方案。这意味着我不得不担心只保留部分对象,我必须有方法在正确的时间获取所有的非规格化数据,并且我不得不放弃关于我的课程的吸引人的想法作为一个角色。
- 选择2
我可以编写完全独立的阶级,一个数据库表,另一个用于TableView中的数据模型。我看不出有什么不妥之处,但似乎也会造成一定程度的重复。
- 选择3
我可以写Service类内的内类,说Service.Extended,这将表示相应的服务对象的非规范化的形式。乍一看,这听起来像是一个很好的解决方案。它允许我保持对象之间的目的分离。内部类对象也可以访问封闭类中所需的字段,从而避免重复。我想我可以使用静态工厂方法轻松地为ObservableList创建JavaFX数据模型对象,该方法将在代码中干净地创建新的Service.Extended对象。
我不能成为第一个有这个问题的人。如果我可能会问,在尝试将规范化数据集适配到GUI表示层时,其他人采用了哪些解决方案?这是Hibernate/JPA可以帮助的事情吗?如果我坚持使用JDBC,内部类是否是一个好主意?