如何使用 JTable 显示和编辑从实体、属性、值 (EAV) 存储(关系 DBMS)中检索到的实体的属性属性?
我知道这是一个有很多可能答案的问题,所以请在回答之前查看我的以下要求。
我保证会投票选出表明您已经阅读并理解整件事的答案(只要它们不是完全愚蠢的)。
用户需要能够:
按属性过滤/搜索实体
选择要显示的属性(作为列)
按所选属性对实体进行排序
编辑属性值
对选定实体执行操作
(可选)能够保存视图供以后使用。
系统要求:
实体数量:需要扩展到 100K+ 唯一实体
属性:用户可以添加和定义新的属性,系统应该能够处理这个
底层存储:H2 数据库(已设计),通过 JDBC 通信
内存:并非所有内容都适合,因此需要以某种方式从 DBMS 查询中提取
性能:应该尽量减少 DBMS 所需的查询数量(每个属性一个查询 OK,我有一个表单,每个表视图有 1 个查询,但它很烂)。
查询:应该需要一个查询来生成与搜索/过滤器匹配的实体列表。否则巨大的性能很糟糕。
重用数据:添加列时不必重新查询或重新排序整个列表。
我看过的东西:
釉面列表库
优点:
- 灵活的色谱柱处理
- 易于实现实体的排序/过滤
- 灵活的列显示格式和编辑
缺点:
- 每个实体一个对象(如果对象很复杂,内存开销将成为严重的内存问题!)
- 负责所有功能的对象......但出于内存原因,对象应该很简单
- 对于每个实体对象,如何在没有 HashMap 的情况下支持用户可选择的列?
扩展 AbstractTableModel 以将数据从 JDBC ResultSet 映射到行、列
- 优点:
- 结果分页避免了内存问题
- 搜索/过滤直接在 SQL 中
- 内存友好,不必每行创建一个对象
- 缺点:
- 实现自定义列和排序是一件痛苦的事情(表头渲染器、管理排序列和顺序等)!
- 可能也必须编写自定义 JTableColumnModel,这会变得混乱!
- 必须大量操作 SQL,因此如果 DB 架构发生更改,则必须重写多段代码!
- 难以维护实体 ID 信息
- 优点:
甲骨文
- 优点:
- 旨在将数据库行映射到对象
- 提供对象管理
- 缺点:
- 实体-属性-价值模型的最差解决方案
- 除了 DBMS 和 Java 代码之外,还必须学习和编写 ORM 代码!
- 实体可以有任意数量的属性,ORM 只适用于静态的、有限的对象属性
- 失去自定义 SQL 的灵活性/速度
- 优点:
有没有我错过的更好的选择,或者有什么聪明的方法可以让 Glazed Lists 或自定义表格模型更容易?
我已经完全放弃了 ORM 作为一个选项,因为它与 EAV 存储的匹配程度非常差。