hibernate - 为什么覆盖会改变列名

标签 hibernate audit hibernate-envers

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

但是,当我覆盖默认值时 - 我所做的就是:

... MyRevisionEntity extends DefaultRevisionEntity

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

有人知道为什么吗?

使用 envers 4.1.5_Final...

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

Adam Warski 创作的“DefaultRevisionEntity”类仅定义了两个成员: 私有(private) int id;

和 私有(private)长时间戳;

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

感谢您的帮助!

最佳答案

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

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

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

但是如果没有检测到自定义实现,generateDefaultRevisionInfoXmlMapping被调用,它将自动构建适当的 XML 结构,该结构使用 @RevisionNumber 的硬编码列名称。和@RevisionTimestamp带注释的字段;因此,您将获得名为 REV 的列和REVTSTMP .

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

关于hibernate - 为什么覆盖会改变列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12736811/

相关文章:

java - 使用 Hibernate envers 查找最近删除的实体

java - 不同的线程获得相同的实体并且彼此看不到变化

java - 如何在 Hibernate 注解中创建 Tinyint Field

java - spring 3、hibernate、dbcp 和 derby 连接问题

laravel - 在 Laravel 中将数据从 SQL 记录到 Redis

c - 绕过内存损坏限制

java - 在数据库中审计错误的日期时间

quarkus - 在 quarkus 中设置 Envers 属性

hibernate - 使用 Hibernate Envers 审计多对多关系

sql - 查询、 native 查询、命名查询和类型化查询之间的区别