是否可以在 Hibernate / JPA 中动态定义列名?

2024-01-11

因此,我有一个现有的数据库模式,其中包含许多我想使用 JPA/Hibernate 进行建模的表。每个 表具有同一组 30 个附加列(以允许运行时扩展字段数量 记录)。

CREATE TABLE XX
  (
    "ID"          VARCHAR2(100 BYTE) NOT NULL ENABLE,
    "USER_LABEL"      VARCHAR2(256 BYTE),
    "CREATION_DATE"   NUMBER(38,0) NOT NULL ENABLE,
    "ADD_STR_FIELD_0" VARCHAR2(200 BYTE),
    "ADD_LNG_FIELD_0" NUMBER(38,0),
    "ADD_DBL_FIELD_0" NUMBER(38,0),
    "ADD_STR_FIELD_1" VARCHAR2(200 BYTE),
    "ADD_LNG_FIELD_1" NUMBER(38,0),
    "ADD_DBL_FIELD_1" NUMBER(38,0),
    "ADD_STR_FIELD_2" VARCHAR2(200 BYTE),
    "ADD_LNG_FIELD_2" NUMBER(38,0),
    "ADD_DBL_FIELD_2" NUMBER(38,0),
    "ADD_STR_FIELD_3" VARCHAR2(200 BYTE),
    "ADD_LNG_FIELD_3" NUMBER(38,0),
    "ADD_DBL_FIELD_3" NUMBER(38,0),
    "ADD_STR_FIELD_4" VARCHAR2(200 BYTE),
    "ADD_LNG_FIELD_4" NUMBER(38,0),
    "ADD_DBL_FIELD_4" NUMBER(38,0),
    "ADD_STR_FIELD_5" VARCHAR2(200 BYTE),
    "ADD_LNG_FIELD_5" NUMBER(38,0),
    "ADD_DBL_FIELD_5" NUMBER(38,0),
    "ADD_STR_FIELD_6" VARCHAR2(200 BYTE),
    "ADD_LNG_FIELD_6" NUMBER(38,0),
    "ADD_DBL_FIELD_6" NUMBER(38,0),
    "ADD_STR_FIELD_7" VARCHAR2(200 BYTE),
    "ADD_LNG_FIELD_7" NUMBER(38,0),
    "ADD_DBL_FIELD_7" NUMBER(38,0),
    "ADD_STR_FIELD_8" VARCHAR2(200 BYTE),
    "ADD_LNG_FIELD_8" NUMBER(38,0),
    "ADD_DBL_FIELD_8" NUMBER(38,0),
    "ADD_STR_FIELD_9" VARCHAR2(200 BYTE),
    "ADD_LNG_FIELD_9" NUMBER(38,0),
    "ADD_DBL_FIELD_9" NUMBER(38,0),
}

我计划为每个表定义简单的类

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="XX")
public class XX {

    @Id
    Long id = null;
}

然后在公共类中定义公共附加参数

import javax.persistence.Column;

public abstract class AdditionalParameters {

    @Column(name="ADD_STR_FIELD_0")
    private String addStringField0 = null;
    @Column(name="ADD_LNG_FIELD_0")
    private Long addLongField0 = null;
    @Column(name="ADD_DBL_FIELD_0")
    private Double addDoubleField0 = null;
    ....
    ....
    ....
    @Column(name="ADD_STR_FIELD_8")
    private String addStringField8 = null;
    @Column(name="ADD_LNG_FIELD_8")
    private Long addLongField8 = null;
    @Column(name="ADD_DBL_FIELD_8")
    private Double addDoubleField8 = null;
}

虽然这可行,但我不喜欢该类的硬编码性质。

我想将每组字符串、长字段和双字段建模为附加参数组,然后 有 0..9 组。如果需要的话,这将使我可以轻松添加额外的组。

如果我使用 xml 映射解决方案,我可以在生成 .hbm.xml 时动态确定正确的列名称 对于每张桌子。我更喜欢使用带注释的解决方案,但是有没有办法覆盖 @Column getName() 方法 这样我就可以返回动态生成的列名称?


您需要创建一个自定义命名策略 http://docs.jboss.org/hibernate/core/3.5/javadocs/org/hibernate/cfg/NamingStrategy.html.

假设您将 spring 和 hibernate 与 JPA 一起使用,下面是带有自定义 NamingStrategy 的配置片段:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="myunit" />
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceXmlLocation"
              value="classpath:META-INF/persistence.xml" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false" />
            <property name="generateDdl" value="true" />
            <property name="database" value="MYSQL" />
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop 
                key="hibernate.ejb.naming_strategy">
                com.yourcompany.CustomNamingStrategy
            </prop>
        </props>
    </property>
</bean>

如果你不使用spring,配置会有所不同,但你仍然可以使用自定义的NamingStrategy(参见实施命名策略 http://docs.jboss.org/hibernate/stable/core/reference/en/html/session-configuration.html#configuration-namingstrategy来自 Hibernate 文档)。

无论如何,这里有一个示例 NamingStrategy,它为连接表构建 TYPE1_TYPE2 形式的表名称,并向所有表添加公共前缀:

public class CustomNamingStrategy extends ImprovedNamingStrategy {

    private static final long serialVersionUID = 1L;
    private static final String PREFIX = "PFX_";

    @Override
    public String classToTableName(final String className) {
        return this.addPrefix(super.classToTableName(className));
    }

    @Override
    public String collectionTableName(final String ownerEntity,
            final String ownerEntityTable, final String associatedEntity,
            final String associatedEntityTable, final String propertyName) {
        return this.addPrefix(super.collectionTableName(ownerEntity,
                ownerEntityTable, associatedEntity, associatedEntityTable,
                propertyName));
    }

    @Override
    public String logicalCollectionTableName(final String tableName,
            final String ownerEntityTable, final String associatedEntityTable,
            final String propertyName) {
        return this.addPrefix(super.logicalCollectionTableName(tableName,
                ownerEntityTable, associatedEntityTable, propertyName));
    }

    private String addPrefix(final String composedTableName) {

        return PREFIX
                + composedTableName.toUpperCase().replace("_", "");

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 Hibernate / JPA 中动态定义列名? 的相关文章

随机推荐

  • Django 管理表格内联查找选择下拉框用于非常大的查询集

    我有一个 django admin 表格内联 其中我有form ProdForm其中持有一个modelchoicefield选择框如下 class ProdForm forms ModelForm productid forms Model
  • 分叉与线程

    我以前在我的应用程序中使用过线程并且很了解它的概念 但最近在我的操作系统讲座中我遇到了 fork 这与线程类似 我用谷歌搜索了它们之间的区别 我发现 Fork只不过是一个新进程 看起来与旧进程或父进程一模一样 但它仍然是一个不同的进程 具有
  • 当我在 iOS13.2 中加载 WKWebView 时,为什么会收到控制台警告:[Process] Kill() 返回意外错误 1?

    自从我安装了iOS 13 2 测试版 我收到了调试控制台错误消息 每次我在情节提要中加载带有 WKWebView 对象的 ViewController 时 都会发生这种情况 然后 当 Web 视图可见时 会连续显示以下消息 2019 10
  • Cordova SQLite:无法读取 null 的属性“事务”

    我正在尝试将 SQLite 集成到我的 Ionic 应用程序中 但我不断收到Cannot read property transaction of null通过浏览器进行远程调试或测试时 尝试在数据库中查询设备上的数据时 因此 我将所有配置
  • xml.etree 还是 xml.dom?

    我正在尝试读取一些 xml 但我不确定应该使用哪个库 xml etree 和 xml dom 哪个更好 为什么 请解释你的答案并给出论点 另外 您认为其中之一会被弃用吗 哪一个 两者都不会被弃用 元素树 http effbot org zo
  • 多个插入的行 ID

    我一次插入多行 如下所示 INSERT INTO person VALUES joe 50 jon 24 然后我需要使用他们的 id 将上面的内容链接到另一个表 通常我会使用LAST INSERT ID INSERT INTO hobbie
  • 如何使用 JavaScript 统计我网站上的访问者数量?

    我需要一个计数器来集成到我的 HTML 代码中 当访问者访问我的网页时 该计数器从一计数到三 例如 如果第一个访问者访问我的页面 则计数为 1 那么下一个访问者访问该页面 则计数为 2 对于第三个访问者 计数为 3 然后对于第四个访问者 又
  • 如何查看google app脚本项目的源代码?

    所以我想以任何方式知道 我们是否可以看到提供了以 exec 结尾的 Web 应用程序 URL 的应用程序脚本项目的源代码 提前致谢 如果您不拥有该脚本或在 Google 云端硬盘中没有与您共享该脚本 则无法查看服务器端代码
  • 不单击所有选项卡并且不循环一次问题

    I am trying to click the tabs on the webpage as seen below Unfortunately it only seems to click some of the tabs despite
  • 基于包含子查询的查询的 ms-access 交叉表查询

    我在基于包含子查询的查询的交叉表查询时遇到问题 查询本身工作正常 但是当我在交叉表查询中使用它时 我收到一条与无法识别的字段名称相关的错误消息 并指向子查询中使用的字段 奇怪的是 我可以毫无问题地在此查询上定义数据透视表或数据透视图 所以
  • Chrome 扩展 - 获取当前选项卡的全部文本内容

    我正在开发一个扩展 我需要获取当前选项卡上的整个文本内容 现在我有一个插件可以从当前选项卡中检索选定的文本 所以 本质上我正在寻找它的 ctrl A 版本 这就是我到目前为止根据 Derek 的提示所做的事情 这是在我的事件处理程序中 这只
  • 当 python2.7 运行良好时,python 3.3 出现缩进错误

    我在下面编写了这个脚本 它将数字转换为其拼写 no raw input Enter a number strcheck str no try val int no except ValueError print sayi degil rai
  • Visual Studio 2010 中的 global.asax.cs 在哪里

    我安装的模板中不再有全局应用程序类代码隐藏 我只有 Global asax 我发现与全局 asax cs 为什么我再也看不到它了 如何重新创建Global asax cs 这是因为您创建的是网站而不是 Web 应用程序 我建议您使用预编译的
  • Kotlin 脚本文件中仅部分语法突出显示

    我在 Android Studio 中打开了一个文件夹 其中包含一个 Kotlin 脚本文件 kts 我在项目结构中配置了 JDK 作为 SDK 但我没有添加 gradle 文件 并且作为 Kotlin 脚本运行该文件工作正常 然而 语法突
  • PHP:尝试让 fgets() 在 CRLF、CR 和 LF 上触发

    我正在使用 proc open 和 fgets stdout 读取 PHP 中的流 尝试获取传入的每一行 许多 Linux 程序 包管理器 wget rsync 仅使用 CR 回车 字符来表示定期 就地 更新的行 例如下载进度 我希望在这些
  • MVC ValidateAntiForgeryToken 多选项卡问题

    我们收到 未提供所需的防伪令牌或该令牌无效 的信息 错误 并且经过一些进一步的调查 我成功地以最简单的形式重新创建了问题 我要么做了完全错误的事情 要么这是防伪令牌系统的限制 不管怎样 我会很感激一些建议 空 MVC 2 项目 一个视图页面
  • 如何在 gemspec 中指定最低 Ruby 版本?

    我正在为新版本的 gem 编写 gemspec 现在需要 Ruby 1 9 以前版本的 gem 可以在 Ruby 1 8 上使用 但现在需要 1 9 有没有办法让这个版本的 gem 安装失败 并为尝试在 Ruby 1 8 上安装它的用户发出
  • /dev/mem 和 /dev/kmem 不存在?

    如果有人能解释一下为什么这两个文件不存在 我将不胜感激 如果没有这两个文件 Android内核的虚拟内存空间和物理空间会是什么样子 Edit I am having Android 2 3 7 Cyanogen mod the 2 file
  • 如何复制整个目录结构?

    我正在将 10 000 个文件从一个目录复制到另一个目录 两个目录结构都有相同的文件 但是 尺寸可能会有所不同 如何强制覆盖不同大小的文件而不复制相同大小的文件 到目前为止我有这个 source D Test1 destination D
  • 是否可以在 Hibernate / JPA 中动态定义列名?

    因此 我有一个现有的数据库模式 其中包含许多我想使用 JPA Hibernate 进行建模的表 每个 表具有同一组 30 个附加列 以允许运行时扩展字段数量 记录 CREATE TABLE XX ID VARCHAR2 100 BYTE N