【问题标题】:JPA/Hibernate dynamic tablesJPA/Hibernate 动态表
【发布时间】:2018-05-11 05:57:59
【问题描述】:

目前我正在进行一个项目,我需要将上传的 Excel/CSV 文件保存到数据库表中。 对于每个上传的文件,应该创建一个具有相同结构(+一些技术列)的新表。 在此之后,数据库表将在网页中显示为 HTML 表。此表将为每个数据集提供基本的 CRUD 功能。

现在我正在决定是直接使用 JDBC 函数还是使用 JPA,在我看来这会更“干净”。第二步,我想通过 OData 和 Olingo 框架发布这些数据。

但我不知道应该如何使用 JPA 函数构建这个通用表结构(每个 Excel 可能有一组非常不同的列)。我的用例中没有静态 POJO 结构。

你们中是否有人知道如何在不知道最终结构的情况下使用 Hibernate 对我的用例进行建模?

第二个想法是构建一个具有以下属性的通用 POJO

  • (字符串)表名
  • (列出)列
  • (列出)数据集

但是使用这种结构,整个数据集总是会更新。当一个表可能有数十万个条目时,这不是一个好的解决方案。 使用像 Mongo 这样的数据库也不是解决方案,因为这个项目需要关系数据库(用于进一步的用例)。否则我可以通过 json 持久化这个 excel。

您好!

【问题讨论】:

  • Eclipselink 具有动态实体(非 JPA 标准,作为扩展)。一般来说,JPA 没有很好地准备好未知表
  • 查看 Hibernate 的实体动态 MapMode。它基本上允许您为应该存储的数据指定表名和键/值对映射。这应该非常适合您的用例。
  • 谢谢!我将深入研究动态地图模式。

标签: java hibernate jpa


【解决方案1】:

这个 Bulk 的过程取决于使用 JPA 或 Hibernate,但使用通用模型并不是什么大问题。

  1. 实体类必须使用 javax.persistence.Entity 注释进行注释(或在 XML 映射中这样表示)
  2. 实体类必须具有公共或受保护的无参数构造函数。它也可以定义额外的构造函数。
  3. 实体类必须是顶级类。
  4. 实体类不能是最终的。实体类的任何方法或持久实例变量都不能是最终的。

等等……

我使用通用实体表,这是结构:

CREATE TABLE T_SPPI_DETT_ENTITY
(
  ID                NUMBER(12)           NOT NULL,
  ATTR_NAME         VARCHAR2(50 BYTE)    NOT NULL,
  ATTR_VALUE            VARCHAR2(500 BYTE),
  ATTR_DATE              DATE
) 

ALTER TABLE  T_SPPI_DETT_ENTITY ADD (
  CONSTRAINT T_DETT_ENTITY_PK  PRIMARY KEY  (ID, ATTR_NAME)
  USING INDEX T_DETT_ENTITY_PK  ENABLE VALIDATE);

对于此表的查询 JPA/Hibernate 不是一个好方法,我使用: 甲骨文PIVOT

【讨论】:

  • 感谢这个想法。但是当应用程序增长到数百万个实体时,我担心表的大小和性能。
猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2016-03-24
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多