【问题标题】:Table name based on entity value in EclipseLink 2.5, JPA 2.0基于 EclipseLink 2.5、JPA 2.0 中实体值的表名
【发布时间】:2013-06-12 06:37:50
【问题描述】:

我想创建基于实体和 JPA 2.0 的设计。在我们当前的架构中,我们将数据存储在 MySQL 的 2000 个分区中。每个分区都是 MyIsam 表,名称从 data_0000 到 data_1999,这只是软件解决方案。由于性能问题,我们没有使用任何特定于数据库的分区选项。这很好用,但从软件的角度来看,我们没有很好的架构。现在我们正在将所有内容迁移到 JPA,我们遇到了这样的问题。

假设当我们要向某个分区插入数据时,我们必须计算分区号(表名),即 data_(entity.object_id mod 2000)。 object_id 列不为空。我们如何使用 JPA 和 EclipseLink 进行设计,如果我有 object_id=453 的实体,那么当我持久保存这个对象时,数据将存储在表 data_0453 中。我在这里http://wiki.eclipse.org/EclipseLink/Examples/JPA/Partitioning 看到了许多基于添加注释的分区示例,但没有一个与基于表名的分区相关。

这种情况的最佳方法是什么?

--

谢谢

【问题讨论】:

    标签: mysql jpa jpa-2.0 eclipselink


    【解决方案1】:

    EclipseLink 的分区支持是针对数据库分区,而不是表分区。大多数数据库都支持表分区,因此您必须自定义构建解决方案很奇怪。

    您能否尝试使用视图或存储过程封装对表的访问? EclipseLink 允许您使用存储过程调用覆盖 CRUD 操作,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/CRUDStoredProcedures

    否则,您可以将子类映射到每个表分区,但是使用 2000,这可能不是一个好的解决方案。您可以使用 EclipseLink 的动态支持来避免创建 2000 个子类。

    您还可以查看 EclipseLink 的多租户支持,它确实具有根据 id 选择表的能力。

    您也可以不映射表并通过本机 SQL 查询访问它。

    但是,我认为使用存储过程可能是您最好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      相关资源
      最近更新 更多