如何从 Hibernate MetadataSources 发现完全限定的表列

2023-11-26

我有一个实体,我有一个实体Class<MyEntity>参考:

@Entity
class MyEntity {
    @Id int id;
    @Column String col1;
    @Column(name = "abc") String col2;
}

我目前正在使用 Hibernate 将我的实体导出到内存数据库中,如下所示:

MetadataSources metadata = new MetadataSources(...);
metadata.addAnnotatedClass(MyEntity.class);
SchemaExport export = new SchemaExport();
export.create(EnumSet.of(TargetType.DATABASE), metadata.buildMetadata());

有关 Hibernate 特定 API 的详细信息请参见此处.

有没有可靠的方法来获取映射MyEntity.col2(带注释的 Java 字段引用)通过 Hibernate API 转换为数据库中的完全限定列名(反之亦然)?我希望避免在没有显式限定的情况下重新实现 Java 标识符(包括 getter 和 setter)如何映射到 SQL 标识符的所有微妙细节。


The org.hibernate.boot.Metadata是我们感兴趣的,因为它包含PersistentClass实体绑定。

首先,您需要创建一个Integrator这将使您能够访问Metadata:

public class MetadataExtractorIntegrator 
    implements org.hibernate.integrator.spi.Integrator {
 
    public static final MetadataExtractorIntegrator INSTANCE = 
        new MetadataExtractorIntegrator();
 
    private Database database;
 
    private Metadata metadata;
 
    public Database getDatabase() {
        return database;
    }
 
    public Metadata getMetadata() {
        return metadata;
    }
 
    @Override
    public void integrate(
            Metadata metadata,
            SessionFactoryImplementor sessionFactory,
            SessionFactoryServiceRegistry serviceRegistry) {
 
        this.database = metadata.getDatabase();
        this.metadata = metadata;
 
    }
 
    @Override
    public void disintegrate(
        SessionFactoryImplementor sessionFactory,
        SessionFactoryServiceRegistry serviceRegistry) {
 
    }
}

如果您使用JPA,可以按如下方式注册:

Map<String, Object> configuration = new HashMap<>();
 
Integrator integrator = integrator();
if (integrator != null) {
    configuration.put("hibernate.integrator_provider", 
        (IntegratorProvider) () -> Collections.singletonList(
            MetadataExtractorIntegrator.INSTANCE
        )
    );
}
 
EntityManagerFactory entityManagerFactory = new EntityManagerFactoryBuilderImpl(
    new PersistenceUnitInfoDescriptor(persistenceUnitInfo), 
    configuration
)
.build();

现在,运行以下测试用例时:

Metadata metadata = MetadataExtractorIntegrator.INSTANCE.getMetadata();

for ( PersistentClass persistentClass : metadata.getEntityBindings()) {
 
    Table table = persistentClass.getTable();
     
    LOGGER.info( "Entity: {} is mapped to table: {}",
                 persistentClass.getClassName(),
                 table.getName()
    );
 
    for(Iterator propertyIterator = persistentClass.getPropertyIterator(); 
            propertyIterator.hasNext(); ) {
        Property property = (Property) propertyIterator.next();
         
        for(Iterator columnIterator = property.getColumnIterator(); 
                columnIterator.hasNext(); ) {
            Column column = (Column) columnIterator.next();
             
            LOGGER.info( "Property: {} is mapped on table column: {} of type: {}",
                         property.getName(),
                         column.getName(),
                         column.getSqlType()
            );
        }
    }
}

反对以下实体:

Database tables

我们得到以下输出:

Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$Tag is mapped to table: tag
Property: name is mapped on table column: name of type: varchar(255)
Property: version is mapped on table column: version of type: integer
 
Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$PostComment is mapped to table: post_comment
Property: post is mapped on table column: post_id of type: bigint
Property: review is mapped on table column: review of type: varchar(255)
Property: version is mapped on table column: version of type: integer
 
Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$Post is mapped to table: post
Property: title is mapped on table column: title of type: varchar(255)
Property: version is mapped on table column: version of type: integer
 
Entity: com.vladmihalcea.book.hpjp.util.providers.entity.BlogEntityProvider$PostDetails is mapped to table: post_details
Property: createdBy is mapped on table column: created_by of type: varchar(255)
Property: createdOn is mapped on table column: created_on of type: datetime(6)
Property: version is mapped on table column: version of type: integer

很酷,对吧?

你可以看看这个例子在 GitHub 上以及。

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

如何从 Hibernate MetadataSources 发现完全限定的表列 的相关文章

随机推荐

  • FastMM:分配的总内存

    我怎样才能获得FastMM分配的内存总量 我已经尝试过 function GetTotalAllocatedMemory Cardinal var MMState TMemoryManagerState begin GetMemoryMan
  • 内联 JavaScript 正则表达式更快吗?

    使用 RegExp 对象还是内联样式更好 为什么 根据 ES3 规范 它们略有不同 因为文字语法 regex 将创建一个RegExp初始扫描时的对象 正则表达式文字是 输入元素被转换为 RegExp 对象 第 15 10 节 当它 被扫描
  • 循环遍历 DataGridView 单元格

    我正在创建一个生成条形码然后打印运输标签的程序 我有一个功能 允许用户将电子表格上传到数据网格视图中 列名称之一是 跟踪号码 我希望能够循环遍历具有跟踪号码的每个单元格 然后在名为 条形码 的列中的新单元格中生成条形码 我知道有一个循环函数
  • 如何从 Capybara 和 ChromeDriver 中拖动 jQuery 滑块手柄?

    我可以执行以下代码来移动滑块手柄 但浏览器中触发的事件没有发生 page execute script Q slider handicap slider values 1 30 这正确地将右侧手柄设置为 30 但我需要它的行为就像我实际上拿
  • JQuery Mobile textarea:如何使用“rows”属性?

    我想使用 JQuery Mobile 动态生成具有不同行数的文本区域 我打算为此使用淘汰赛 将数据绑定到rows属性 例如 这里 http jsfiddle net j7b9A 2
  • 删除 .NET RichTextBox 中的特定行

    如何删除 RichTextBox 中的特定文本行 另一个解决方案 private void DeleteLine int a line int start index richTextBox GetFirstCharIndexFromLin
  • 如何使用 RLMArray 保存数组

    注意 我对 Realm 和 Swift 相当陌生 所以请原谅我不理解的任何明显的事情 我有一个正在工作的 UITableView 我计划用任务填充它 我希望用户能够根据需要添加和删除任务 因此我无法对任务进行硬编码 并且我希望在应用程序启动
  • 返回 JSONP 的 Restful api 的节点 HTTP 请求

    我正在尝试使用node js 对restful API 进行服务器端调用 JSONP JS 函数内的 JSON 容器 的返回返回错误 这似乎是节点 http get options callback API 的核心 节点或任何模块可以从 J
  • Android 音频编程噩梦 - soundpool、audiotrack arrghh?

    我构建了一个简单的音乐音序器 Android 应用程序 可以播放多个音频文件 最初我使用 SoundPool 来播放 mp3 文件 它在 2 3 4 上与旧的 HTC Droid Incredible 完美配合 然后我在运行 4 3 的 G
  • JPA多对多关系导致无限递归和堆栈溢出错误

    我正在开发一个 EclipseLink 项目 其中一个用户可以 关注 另一个用户 就像在社交媒体网站上一样 我有这个设置User实体 引用一个名为users 其中有一个 关注者 列表 关注该用户的用户 和另一个 关注 列表 该用户正在关注的
  • ASP.NET WSAT(网站管理工具)和自定义会员资格提供程序

    我正在构建一个 ASP NET MVC 应用程序 它将具有自定义角色和成员资格提供程序 我一直在研究管理工具来节省我们一些时间 WSAT已经横穿了我的道路 一眼看上去不错 都是开源的 而且很简单 如果不行我可以自己修复 第一个问题是 你们中
  • 为什么 MobX v6.x 在 React with Typescript 中不能按预期工作?

    我目前正在编写一个 React 应用程序 它应该能够在任何可观察到的值发生变化时重新渲染组件 问题是我无法得到email如果发生变化则重新渲染 store ts export class ExampleStore observable em
  • RewriteRule - 两个参数,但最后一个参数是可选的

    我无法重写以包含两个参数 但最后一个参数是可选的 例如 http www mywebsite com friends jamie 正斜杠也应该是可选的 这应该与此相同 http www mywebsite com friends php n
  • 隐藏奇怪的不需要的 Xcode 日志

    使用 Xcode 8 并创建新的空白项目时 运行应用程序时会出现以下日志 2016 06 13 16 33 34 406093 TestiOS10 8209 100611 bundleid com appc TestiOS10 enable
  • 在数据库中的任意位置查找值

    给定一个数字 我如何发现它可以在哪个表和列中找到 我不在乎它是否快 它只需要工作 这可能对你有帮助 来自纳拉亚纳 维亚斯 它搜索给定数据库中所有表的所有列 我以前用过它并且有效 这是上面链接中的存储过程 我所做的唯一更改是用临时表替换表变量
  • 有没有办法自动占据WrapPanel中的空白区域?

    WrapPanel 的子级按顺序填充 如所附屏幕截图所示 因此 Panel根据每个孩子的身长 制作了较长的空白 如何利用空白空间重新排列孩子们 到目前为止 似乎只有很少的人使用 WrapPanel 并且没有足够的示例 有一些自动的方法吗 或
  • EXECUTE 后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。先前计数

    我收到有关提交和回滚的异常 但不确定我的存储过程到底出了什么问题 我已阅读其他此类问题的答案 但无法找到提交计数到底在哪里混乱 所以 这是我使用的存储过程 this is a procedure used for the purge uti
  • 如何配置 leiningen 以使用最新的 Clojure 版本来在项目之外启动 repl?

    当我为特定项目启动 clojure repl 时 对于 leiningen 来说足以在具体中指定正确的 clojure 版本项目 clj如上所述的文件here 但是当我在项目之外启动 repl 时 旧版本就会启动 就我而言 旧版本是1 5
  • Airflow安装成功,但无法运行

    C Python27 Scripts gt airflow initdb airflow 不被识别为内部或外部命令 可运行的程序或批处理文件 C Python27 Scripts gt 气流初始化 airflow 不被识别为内部或外部命令
  • 如何从 Hibernate MetadataSources 发现完全限定的表列

    我有一个实体 我有一个实体Class