我正在将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_name
和fileName_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_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());
答案 0 :(得分:0)
理想的解决方案是扩展path
实现,并检查identifeir是否以path
后缀结尾,如果是,则使其返回相同的标识符而不更改它。然后配置spring-boot
以使用自定义命名策略,这样就无需重新命名列即可完成工作。