【问题标题】:Why I get HHH015011: Unable to locate static metamodel field?为什么我得到 HHH015011:无法定位静态元模型字段?
【发布时间】:2019-11-18 10:16:31
【问题描述】:

我必须处理声明如下的视图(Oracle 11g):

  create view V_SOME_VIEW as
  select X, Y
  from SOME_TABLE

以及它的实体:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

@Entity
@Table("V_SOME_VIEW")
@NamedQueries({
   @NamedQuery(name = "VSomeView.findAll", query = "SELECT v FROM VSomeView v")})
public class VSomeView implements Serializable {

   private static final long serialVersionUID = 1L;

   @Id
   @Lob
   @Column(name = "X")
   private Object x;

   @Lob
   @Column(name = "Y")
   private Object y;

   ...    
}

使用Gradle Metamodel Plugin 生成静态元模型后,我有以下元模型没有属性y

import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(VSomeView.class)
public abstract class VSomeView_ {

   public static volatile SingularAttribute<VSomeView, Object> x;

   public static final String X = "x";
}

在应用程序启动时出现如下错误:

错误 o.h.ejb.metamodel.MetadataContext:HHH015011:无法找到静态元模型字段:...VSomeView_#y

如果我将列类型从 java.lang.Object 更改为 java.lang.String,则正确生成字段 y。谁能解释一下,请问这是什么原因?

【问题讨论】:

  • this。默认情况下,休眠使用 java.lang.String 作为CLOB JDBC 类型。否则,您应该使用custom hibernate type
  • @SternK,感谢您的回复!不幸的是,我仍然不明白为什么不正确的类型会导致元模型属性丢失。我试图用谷歌搜索它,但没有结果。请您指出一个文档部分或对此进行简要解释吗?提前致谢!
  • 能否解释一下,为什么要将x, y 字段声明为java.lang.Object?你想达到什么目标?
  • 老实说,我不知道。这是遗留代码,我只是想弄清楚为什么缺少元模型的某些属性。事实上,字段实际上是 BLOB 的情况很少。它们中的大多数只是 VARCHAR。考虑到您的第一条评论,我认为最好只修复 Java 代码中的类型

标签: java hibernate jpa generator metamodel


【解决方案1】:

来自 JPA 规范

6.2.1.1 规范元模型

对于由类X 声明的每个持久非集合值属性y,其中y 的类型为Y,元模型类必须包含如下声明:

public static volatile SingularAttribute&lt;X, Y&gt; y;

因此,从这个角度来看,您在元模型类中看到 y 属性的期望似乎得到了证实。

但是深入到注解处理器的 Hibernate 实现中 JPAMetaModelEntityProcessor,如果MetaAttributeGenerationVisitor类的方法isBasicAttribute返回

在以下情况下是可能的:

  1. 持久性属性由以下注释之一进行注释: @Basic@OneToOne@ManyToOne@EmbeddedId@Id

  2. persistent 属性使用注解@Type 进行注解,这意味着它是一个休眠自定义类型。

  3. 持久属性是an enum

  4. 持久属性是a primitive type

  5. 持久属性是a hibernate basic type

  6. 持久化属性是一个实现Serializable接口的类。

  7. 持久属性是一个使用@Embeddable注解的类。

由于@Id 注释,您的第一个持久属性满足 n.1 条件,但第二个不满足 n.1-7 条件,这就是它在生成的元模型中不存在的原因。

另见this

【讨论】:

  • 哇!非常感谢您的详细回答!现在一切都清楚了!万岁!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 2017-12-12
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多