扫描查询为_MOD列使用错误的列名

时间:2019-07-09 10:35:33

标签: java hibernate-envers

我正在将Hibernate Envers与@Audited( withModifiedFlag=true )一起使用,但我遇到的问题是,为查询生成的SQL具有与HBM2DDL工具为_MOD列生成的列名不同的列名

该问题可能与我正在覆盖here中所述的Hibernate命名策略有关。但是尝试进行调试时,我并没有运气验证这种理论-命名策略似乎没有遇到任何断点。

实体看起来像这样(省略了无关的属性):

@Entity
@Table(name = "file")
@Audited(withModifiedFlag = true)
public class FileEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "file_name")
    private String fileName;
}

生成的_AUD表如下所示:

CREATE TABLE file_AUD (
    id int8 NOT NULL,
    REV int4 NOT NULL,
    REVTYPE int2,
    REVEND int4,
    file_name varchar(255),
    fileName_MOD boolean,
    PRIMARY KEY (id, REV)
);

我可以看到file_namefileName_MOD列之间的差异,但这似乎是可以预期的,如here

所述

当更改实体或使用AuditReaderFactory进行查询时,将显示以下SQL错误:

ERROR: column fileentity0_.file_name_mod does not exist
  Hint: Perhaps you meant to reference the column "fileentity0_.filename_mod".

我正在使用PostgreSQL和Hibernate 5.2.13.Final 我知道在每个属性上使用modifiedColumnName可以解决,但是上面的示例只是我要审核的许多实体之一,因此我正在寻找其他解决方案。

编辑:

深入研究NamingStrategy,似乎代码实际上并没有使用我添加的自定义代码。似乎Hibernate的naming_strategy属性被分为implicit_naming_strategyphysical_naming_strategy,随着项目中Hibernate版本的更新,这似乎没有引起注意。 相反,这些属性由Spring JPA默认提供,如下所示:

hibernate.implicit_naming_strategy:org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
hibernate.physical_naming_strategy:org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

由于他们已经完成了这项工作(在Envers问题之外),所以我将不再使用自定义项。

我使用的查询示例:

AuditReader auditReader = AuditReaderFactory.get(entityManager);

AuditQuery auditQuery = auditReader.createQuery()
        .forRevisionsOfEntity(FileEntity.class, false, true)
        .addOrder(AuditEntity.revisionNumber().desc())
        .setFirstResult((int) pageable.getOffset())
        .setMaxResults(pageable.getPageSize());

1 个答案:

答案 0 :(得分:0)

理想的解决方案是扩展path实现,并检查identifeir是否以path后缀结尾,如果是,则使其返回相同的标识符而不更改它。然后配置spring-boot以使用自定义命名策略,这样就无需重新命名列即可完成工作。