为啥覆盖会更改列名

Posted

技术标签:

【中文标题】为啥覆盖会更改列名【英文标题】:Why does overriding change column names为什么覆盖会更改列名 【发布时间】:2012-09-26 01:15:44 【问题描述】:

我使用的是 rev 监听器的默认实现,正如预期的那样,我的 REVINFO 表中的列是:revtstmp 和 rev。

但是,当我覆盖默认设置时 - 我所做的只是:

... MyRevisionEntity extends DefaultRevisionEntity

这些列名已更改为“timestamp”和“id”。

有人知道为什么吗?

使用环境 4.1.5_Final...

** 编辑 ** 由于尚未有人回答,我正在添加更多信息。

Adam Warski 创作的“DefaultRevisionEntity”类只定义了两个成员: 私人 int id;

和 私有长时间戳

因此,我知道当我扩展该类时,这些将是我应该期望的列名。然而,“令人费解”的问题是:为什么当我没有扩展默认值时,列是不同的(分别是 rev 和 revtstmp)以及文档所说的内容?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

简短的回答是因为当您不扩展时,Envers 使用默认配置,该配置将这些列名称硬编码,例如它们并非源自实体类的元数据。当你扩展 DefaultRevisionEntity 时,Envers 默认使用标准的 ORM 命名策略。

从技术上讲,RevisionInfoConfiguration 是这里的罪魁祸首。

作为 Envers 的引导程序的一部分,该类的 #configure() 方法被调用,它在定义的实体中搜索自定义修订实体实现。如果检测到实现,Envers 基本上会像任何其他实体一样映射该类。

但如果未检测到自定义实现,则会调用 generateDefaultRevisionInfoXmlMapping,这将自动构建适当的 XML 结构,该结构对 @RevisionNumber@RevisionTimestamp 注释字段使用硬编码的列名;因此,您会得到名为 REVREVTSTMP 的列。

我已注册 JIRA 问题 HHH-11325 以解决改进问题。

【讨论】:

以上是关于为啥覆盖会更改列名的主要内容,如果未能解决你的问题,请参考以下文章

为啥悬停伪类会覆盖活动伪类

为啥我们不能在 C# 中覆盖方法时更改访问修饰符?

Pytest 和覆盖率:为啥覆盖率结果会随目录结构而变化?

为啥 UIButton 会覆盖 UITapGestureRecognizer?

为啥 plist 中的项目会被覆盖?

iPhone界面为啥会覆盖