В запросах Envers используются неправильные имена столбцов для столбцов _MOD - PullRequest
0 голосов
/ 09 июля 2019

Я использую Hibernate Envers с @Audited( withModifiedFlag=true ), и у меня возникла проблема, когда SQL, сгенерированный для запросов, имеет имена столбцов, отличные от того, который генерируется инструментом HBM2DDL для столбцов _MOD

Возможно, проблема связана с тем фактом, что я переопределяю стратегию именования 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_name и fileName_MOD, но это, как представляется, ожидается, как описано здесь

При изменении объекта или при использовании 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_strategy и physical_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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...