Я использую 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());