gpt4 book ai didi

java - 为什么我收到 HHH015011 : Unable to locate static metamodel field?

转载 作者:行者123 更新时间:2023-11-30 01:43:55 27 4
gpt4 key购买 nike

我必须处理声明如下的 View (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";
}

在应用程序启动时,我遇到如下错误:

ERROR o.h.ejb.metamodel.MetadataContext: HHH015011: Unable to locate static metamodel field: ...VSomeView_#y

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

最佳答案

来自 JPA 规范

6.2.1.1 Canonical Metamodel

For every persistent non-collection-valued attribute y declared by class X, where the type of y is Y, the metamodel class must contain a declaration as follows:

public static volatile SingularAttribute<X, Y> y;

所以,从这个角度来看,您期望看到 y元模型类中的属性看起来得到证实。

但是深入了解注释处理器的 Hibernate 实现 JPAMetaModelEntityProcessor ,我们可以发现,如果类 MetaAttributeGenerationVisitor 的方法 isBasicAttribute ,则元模型类中将出现一个非集合值属性。返回true

以下情况是可能的:

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

  2. 持久属性使用注释 @Type 进行注释。这意味着它是一个 hibernate 自定义类型。

  3. 持久属性是 an enum .

  4. 持久属性是 a primitive type

  5. 持久属性是 a hibernate basic type

  6. 持久属性是一个实现 Serializable 的类界面。

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

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

另请参阅this .

关于java - 为什么我收到 HHH015011 : Unable to locate static metamodel field?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58912255/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com