Почему я получаю сообщение HHH015011: невозможно найти поле статической метамодели?

Мне приходится иметь дело с представлением, объявленным следующим образом (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 у меня есть следующая метамодель без атрибут у:

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 будет создано правильно. Может кто-нибудь объяснить мне, в чем причина этого, пожалуйста?


person Yaroslav    schedule 18.11.2019    source источник
comment
См. это. По умолчанию спящий режим использует java.lang.String для типа CLOB JDBC. В противном случае следует использовать пользовательский тип гибернации. .   -  person SternK    schedule 18.11.2019
comment
@SternK, спасибо за ответ! К сожалению, я до сих пор не понимаю, почему неверный тип приводит к отсутствию свойства метамодели. Я пытался найти его в Google, но безрезультатно. Не могли бы вы указать на раздел документации или дать краткое объяснение этого? Заранее спасибо!   -  person Yaroslav    schedule 18.11.2019
comment
Не могли бы вы объяснить, почему вы хотите объявить x, y поля как java.lang.Object? Чего вы хотите достичь?   -  person SternK    schedule 18.11.2019
comment
Честно говоря, я понятия не имею. Это устаревший код, и я просто пытался понять, почему отсутствуют некоторые атрибуты метамодели. Фактически, есть несколько случаев, когда поля на самом деле являются большими двоичными объектами. Большинство из них просто VARCHAR. Принимая во внимание ваш первый комментарий, я думаю, что было бы лучше просто исправить типы в коде Java   -  person Yaroslav    schedule 18.11.2019


Ответы (1)


Из спецификации JPA

6.2.1.1 Каноническая метамодель

Для каждого постоянного атрибута, не связанного с коллекцией, y, объявленного классом X, где тип y равен Y, класс метамодели должен содержать следующее объявление:

public static volatile SingularAttribute<X, Y> y;

Итак, с этой точки зрения ваше ожидание увидеть свойство y в классе метамодели выглядит обоснованным.

Но углубимся в реализацию процессора аннотаций в Hibernate JPAMetaModelEntityProcessor, мы можем узнать, что в классе метамодели будет присутствовать атрибут без значения коллекции, если метод isBasicAttribute класса MetaAttributeGenerationVisitor возвращает true.

Это возможно в следующих случаях:

  1. Постоянный атрибут снабжен одной из следующих аннотаций: @Basic, @OneToOne, @ManyToOne, @EmbeddedId, @Id.

  2. Постоянный атрибут снабжен аннотацией @ Тип, что означает, что это пользовательский тип гибернации.

  3. Постоянный атрибут — это перечисление.

  4. Постоянный атрибут — это примитивного типа

  5. Постоянный атрибут — это базовый тип спящего режима.

  6. Постоянный атрибут — это класс, реализующий Serializable. интерфейс.

  7. Постоянный атрибут — это класс, аннотированный @Embeddable. аннотация.

Ваш первый постоянный атрибут соответствует условию n.1 из-за аннотации @Id, а второй не соответствует условиям n.1-7, поэтому он отсутствует в сгенерированной метамодели.

См. также это.

person SternK    schedule 22.11.2019
comment
Ух ты! Я очень ценю ваш подробный ответ! Теперь мне все ясно! Ура! - person Yaroslav; 24.11.2019