2013-04-06 39 views
2

另一个新手问题。我有一个声明这样的一个关系型数据库的表称为服务:普通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,内部类是否是一个好主意?

回答

3

如何从UI回来?我的意思是:

  • 设计的UI做你需要它做..
  • 在创建一个支持类(模型)与JavaFX的属性
  • 写DAO来存储模型。属性在你的表中。

通过这样做,您只需编写您完全需要的代码,无需担心抽象。虽然DAO将反映出数据库设计的复杂性,但是您正在试图解决1:1的问题。

最好的和最简单的解决方案是最简单的用最少的代码,至少班,并至少第三方的依赖。

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