当前不支持公式映射 - Hibernate ORM Envers

Posted

技术标签:

【中文标题】当前不支持公式映射 - Hibernate ORM Envers【英文标题】:Formula mappings are currently not supported - Hibernate ORM Envers 【发布时间】:2017-11-03 19:15:50 【问题描述】:

我使用 Hibernate Envers:

@Entity 
@Table(name = "user")
@Audited
class User()

    private String id;
    @Formula("(SELECT name FROM other c where c.id = id)")
    private Integer name;

它抛出:

[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: 调用 init 方法失败;嵌套异常是 org.hibernate.envers.configuration.internal.metadata.FormulaNotSupportedException: 公式映射(除了@DiscriminatorValue)目前不是 支持

如何使用@Formula 和 Hibernate Envers 计算实体属性?

仅供参考,当我删除 Hibernate Envers 时,它可以正常工作。

【问题讨论】:

【参考方案1】:

问题是您要求 Envers 审核 @Formula 带注释的列,目前不支持该列。我打开 JIRA HHH-11785 的唯一目的是为了进一步研究。

但是,您应该能够使用 @NotAudited 注释公式字段,并且 Envers 应该可以很好地与该配置集成。真正的问题是,当它发现要跟踪基于公式的字段的历史时,它会失败。

举个例子:

@Entity
@Audited
class User 
  @Formula("SELECT name FROM Other ...")
  @NotAudited
  private String name;
  // other attributes

【讨论】:

您的代码给我:h.engine.jdbc.spi.SqlExceptionHelper:“字段列表”嵌套异常中的未知列“user0_.name”是 javax.persistence.PersistenceException:org.hibernate.exception。 SQLGrammarException: 无法提取 ResultSet] 您确认您的公式有效吗?我向您建议的唯一代码是将字段标记为未审核,以便 Envers 继续通过您的失败点。我需要更多详细信息来进一步提供帮助,但这听起来像是正在执行一些无效查询。 你的例子不起作用,我添加了这样的括号:@Formula("(SELECT name FROM Other ...)") 现在它起作用了 如果您必须将语句包装在 () 中,那么这是一个错误。您不必包装 @Formula 注释。我也会在 JIRA 中添加一条关于对此进行调查的说明。 如果您可以将不带括号的错误堆栈跟踪添加到提到的 JIRA 中的注释中,那将非常有帮助。

以上是关于当前不支持公式映射 - Hibernate ORM Envers的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate ORM - 实体属性支持 Java 1.8 Optional

Hibernate与Mybatis的区别

ORM简介 && MyBatis和Hibernate的不同 && 动态代理简单实现Mybatis基本使用

hibernate入门

Hibernate ORM框架——续第二章:Hibernate映射关系:单向关联

mybatis 和 hibernate 本质区别和应用场景