JPA/Hibernate Estática Metamodelo Atributos no se Rellena — NullPointerException

Me gustaría usar JPA2 Criterios de la API con metamodelo objetos, que parece ser bastante fácil:

...
Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
... albm.get(JPAAlbum_.theme) ... ;

pero esta Raíz.obtener siempre genera una NullPointerException. JPAAlbum_.theme fue generado automáticamente por Hibernate y parece

public static volatile SingularAttribute<JPAAlbum, JPATheme> theme;

pero, obviamente, nunca se llena.

Que me estoy perdiendo un paso en la inicialización del marco ?

EDICIÓN: aquí es un fragmento de ¿cómo puedo usar JPA y el metamodelo cuando se estrellan:

    CriteriaBuilder cb = em.getCriteriaBuilder();

    CriteriaQuery<JPAAlbum> cq = cb.createQuery(JPAAlbum.class) ;
    Root<JPAAlbum> albm = cq.from(JPAAlbum.class);
    cq.where(cb.equal(albm.get(JPAAlbum_.theme).get(JPATheme_.id),
                        session.getTheme().getId())) ;

(JPAAlbum_ es una clase, así que me import antes) y de la stacktrace:

Caused by: java.lang.NullPointerException
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)
    at net.wazari.dao.jpa.WebAlbumsDAOBean.getRestrictionToAlbumsAllowed(WebAlbumsDAOBean.java:55)

EDIT 2:

En el JBoss EntityManager guía, puedo ver que

Cuando la Hibernación EntityManagerFactory está siendo construido, será buscar un canónica del metamodelo de clase para cada uno de los administrados escrito se conoce y si encuentra alguno va a impulsar el adecuado metamodelo de la información en ellos, como se describe en [2 de la Especificación JPA, sección 6.2.2, pg 200]

También pude comprobar con

     for (ManagedType o : em.getMetamodel().getManagedTypes()) {
            log.warn("___") ;
            for (Object p : o.getAttributes()) {
                log.warn(((Attribute)p).getName()) ;
            }
        }

que la Hibernación está consciente de mi metamodelo, los nombres de los atributos se escriben, sin embargo

   log.warn("_+_"+JPAPhoto_.id+"_+_") ;

sigue siendo desesperadamente vacía …

EDIT3: aquí está el JPAAlbum entidad y su metamodelo de la clase.

¿Qué más puedo decir acerca de la configuración de mi …

  • Yo uso Hibernat 3.5.6-Final (según el META-INF/MANIFEST.MF),

  • implementar en Glassfish 3.0.1

  • de Netbeans 6.9.1;

  • y la aplicación se basa en EJB 3.1,

Espero que ayude !

EDITAR 4:

por desgracia, la prueba de JUnit nos lleva a la misma excepción:

java.lang.NullPointerException
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)
    at net.wazari.dao.test.TestMetaModel.foo(TestMetaModel.java:55)

Una forma mucho más simple proyecto está disponible aquí/tarball. Sólo contiene mi entidades y su metamodelo, además de una prueba de JUnit (foo accidentes con metamodelo, bar está de acuerdo con la costumbre de Consulta.

EDITAR 5:

Usted debería ser capaz de reproducir el problema descargando el tarball, la construcción del proyecto:

ant compile
or
ant dist

y empezar la prueba de JUnit net.wazari.dao.test.TestMetaModel

 CLASSPATH=`sh runTest.sh` java org.junit.runner.JUnitCore  net.wazari.dao.test.TestMetaModel

(edición runTest.sh a punto de ruta de clases para la ubicación correcta de su JUnit4-5 jar)

Todos los hibernate dependencias yo uso debe ser incluido en el archivo.

  • Por favor, mostrar su totalidad fragmento de código (no entiendo cómo va a usar el metamodelo) y el stacktrace.
  • Thivent, he actualizado a la pregunta con lo que usted solicitó, gracias
  • Puedes mostrar tu entidad para que yo pudiera reproducir?
  • He actualización de la pregunta
  • sólo para tu INFORMACIÓN, la pregunta, que es muy probable que sea un error, ha sido resuelto !
InformationsquelleAutor Kevin | 2010-10-04

8 Kommentare

  1. 46

    Tuve el mismo problema y lo ha solucionado poniendo el Model y Model_ clase en el mismo paquete.

    • da un poco de esperanzas, pero me temo que cuando yo hice la prueba del caso de Pascal, todo lo que debería haber sido en el mismo paquete … voy a ver de que esta tarde !
    • No lo puedo creer, esa es la solución !! Muchas gracias por este tan valioso pequeña pista 😉
    • +1 Tenía casi el mismo problema al usar el Eclipselink en lugar de Hibernación, que inicialmente sólo funcionó bien & luego dejó de hacerlo – en el mismo paquete, por supuesto…
    • +1 ¿tiene usted alguna idea. ¿Por qué debería estar en el mismo paquete?
    • alguien puede explicar un poco más acerca de cómo agregar clases en el mismo paquete ? el mismo paquete en el que todas las otras clases de entidad son ? tiene alguna hibernate anotación poner en estas clases ?
  2. 11

    Yo tenía una de aplicaciones Java EE 6 uso de EclipseLink en GlassFish con algunos @StaticMetamodel las clases creadas y todo estaba funcionando bien. Cuando me cambié a Hibernate 4 en JBoss 7, empecé a conseguir estas Entradas también. Me puse a investigar y me encontré con esta página:

    http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/metamodel.html

    Cita a las 2 de la especificación JPA, sección 6.2.1.1 que define cómo la estática de clases del metamodelo debe ser construido. Por ejemplo, me enteré leyendo la especificación de que «la opción de diferentes paquetes serán proporcionados en una versión futura de este pliego de condiciones». Tuve el metamodelo clases en diferentes paquetes y funcionó bien en EclipseLink, pero es una característica extra, como el actual estándar indica lo siguiente:

    • Metamodelo las clases deben ser en el mismo paquete que las clases de entidad que describen;
    • Deben tener el mismo nombre que las clases de entidad que describen, seguido por un carácter de subrayado (por ejemplo, Producto de la entidad, Product_ es el metamodelo de la clase);
    • Si una entidad hereda de otra entidad o de un mapa de la superclase, su metamodelo de la clase debe heredar de la clase del metamodelo que describe su superclase inmediata (por ejemplo, si SpecialProduct se extiende Producto, que se extiende PersistentObject, entonces SpecialProduct_ debe extenderse Product_ que debe extenderse PersistentObject_).

    Una vez he seguido todas las reglas en la especificación (el anterior es sólo un resumen, por favor refiérase a la sección 6.2.1.1 de la especificación de la versión completa), dejé de recibir las excepciones.

    Por el camino, usted puede descargar las especificaciones aquí: http://jcp.org/en/jsr/detail?id=317 (haga clic en «página de Descarga» para la versión final, elegir descargar la especificación para la evaluación, aceptar el acuerdo y de descargar el archivo «SR-000317 la Especificación 2.0» – persistencia-2_0-final-spec.pdf).

    • Una nota más sobre MappedSuperclass no se menciona en la Hibernación de especificaciones: a la hora de ampliar la base del metamodelo, usted no debe redefinir los parámetros definidos en la base de la subclase.
    • gran trabajo @Vítor E. Silva Souza!
    • Gracias, @PashaGharibi!
  3. 8

    No puedo reproducir el problema. He utilizado algunas de sus entidades (versiones simplificadas de JPAAlbum, JPATheme y JPATagTheme, sin ningún tipo de interfaces), que generan el metamodelo y clases de la siguiente rudimentario método de prueba (que se ejecuta dentro de una transacción) sólo pasa:

    @Test
    public void foo() {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<JPAAlbum> query = builder.createQuery(JPAAlbum.class);
    
        Root<JPAAlbum> album = query.from(JPAAlbum.class);
    
        Assert.assertNotNull(album.get(JPAAlbum_.theme)); //no problem here
    
        query.where(builder.equal(album.get(JPAAlbum_.theme).get(JPATheme_.id), 1L));
    
        List<JPAAlbum> results = em.createQuery(query).getResultList();
    }

    Por lo que vale, aquí es el SQL generado:

    select
        jpaalbum0_.ID as ID32_,
        jpaalbum0_.AlbumDate as AlbumDate32_,
        jpaalbum0_.Description as Descript3_32_,
        jpaalbum0_.Nom as Nom32_,
        jpaalbum0_.Picture as Picture32_,
        jpaalbum0_.Theme as Theme32_ 
    from
        Album jpaalbum0_ 
    where
        jpaalbum0_.Theme=1

    Probado con Hibernate EntityManager 3.5.6-Final, Hibernate JPAModelGen 1.1.0.Final, fuera de cualquier contenedor.

    Mi sugerencia sería el primer intento de reproducir (si reproducible) el problema en una prueba de JUnit contexto.

    PS: Como una nota de lado, yo no almacenar las clases generadas en la VCS.


    Actualización: Aquí es un persistence.xml que se pueden utilizar en un contexto de pruebas:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
      version="2.0">
      <persistence-unit name="MyPu" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
    
        <class>com.stackoverflow.q3854687.JPAAlbum</class>
        <class>com.stackoverflow.q3854687.JPATheme</class>
        <class>com.stackoverflow.q3854687.JPATagTheme</class>
    
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
    
        <properties>
          <!-- Common properties -->
          <property name="javax.persistence.jdbc.driver" value="${jdbc.driver}" />
          <property name="javax.persistence.jdbc.url" value="${jdbc.url}" />
          <property name="javax.persistence.jdbc.user" value="${jdbc.user}" />
          <property name="javax.persistence.jdbc.password" value="${jdbc.password}" />
    
          <!-- Hibernate specific properties -->
          <property name="hibernate.dialect" value="${jdbc.dialect}" />
          <!--
          <property name="hibernate.show_sql" value="true"/>
          -->
          <property name="hibernate.format_sql" value="true" />
          <property name="hibernate.hbm2ddl.auto" value="update" />   
        </properties>
      </persistence-unit>
    </persistence>
    • Estoy tratando de poner a prueba en JUnit, pero mi clase de entidad no son reconocidos por Hibernate ‘IllegalArgumentException: No es una entidad: la clase …JPAAlbum’ (en su ‘de’ método) o ‘NoResultException: No entidad encontrar para la consulta» (en el habitual de Consulta.getSingleResult();)
    • «Yo no almacenar las clases generadas» Mi idea es: 1) mantener la VCS es un error de estado libre, 2) actualizar manualmente las entidades/metamodels tan pronto como una menor de edad-porque-lo-db-estructura-es-ahora-bastante-actualización estable, es una mala idea?
    • Hmm, ¿usted se declara de entidades en un persistence.xml (en un contexto de Java SE, no se descubren automáticamente, usted necesita hacer una lista de ellos de forma explícita)? En realidad, toda la persistence.xml será diferente. Voy a publicar un ejemplo.
    • Con respecto a su VCS enfoque, si se derivan B de Un en forma determinística, luego de tener Una en un estado estable es suficiente. Pero yo no llamaría a almacenar B a mala idea, es sólo un enfoque diferente. Algunas personas, como para almacenar el código generado, algunos otros prefieren mantener la generación de paso como construir sólo la actividad. En el primer caso, usted puede obtener las fuentes de información, y estás listo. Pero usted tiene que comprometerse código generado después de cada cambio. En el segundo caso, se necesita una generación de paso antes de compilar. Es discutible, pero yo prefiero el enfoque más tarde 🙂
    • He actualizado a la pregunta, la prueba de JUnit falla así, ¿qué otra cosa podría intentar … ?
    • Bueno, es realmente buena que la de prueba de JUnit está fallando. Al menos esto significa que el problema es reproducible. Me gustaría tener un mirar, pero no podía encontrar la manera de hacer un anónimo checkout desde el repositorio svn. No me pierdas las instrucciones?
    • lo siento, he añadido un enlace a un tar ed versión que usted debería ser capaz de reproducir. (a su derecha que JUnit fallando es en realidad una suerte, yo no lo ven de esta manera 🙂
    • gracias por su ayuda, que merecen la recompensa! siéntase libre de dejarme saber si usted tiene cualquier otra pista sobre lo que puede estar mal, voy a darle una oportunidad !
    • Gracias, que bueno de usted. Yo sólo tenía un rápido vistazo a su código, pero no había tenido la oportunidad de probarlo por ahora (voy a hacer!), sobre todo porque la prueba de JUnit no ejecutar «como es». Me acabo de dar cuenta que no tiene ningún frasco de un JPA proveedor en las bibliotecas, en la que los normales? Me temo que voy a tener que mover el código a un proyecto de Maven, yo no soy muy paciente con Ant y JAR el infierno 🙂
    • He actualizado el archivo tar para contener todos los Frascos, debería ser más fácil para usted para reproducir la situación (Maven podría ser el siguiente paso para mi proyecto!)

  4. 0

    Me ofrecen una solución alternativa si poniendo el Modelo y Model_ en el mismo paquete no funciona. Usted necesita agregar un método init() de la clase que construye el SessionFactory o EntityManager:

    public class HibernateSessionFactory {
      private static SessionFactory factory;
    
      static {
        try {
            factory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
      }
    
      public static SessionFactory getFactory() {
        return factory;
      }
    
      public static void init(){} //does nothing but elimating the NULLPOINTEREXCEPTION
    }

    Así que cuando se ejecuta la aplicación desde el principal método o una unidad de prueba que usted necesita llamar a HibernateSessionFactory.init(); primera. A continuación, el NullPointerException desaparezca por arte de magia y de funcionamiento de la aplicación.

    Este extraño comportamiento parece suceder cuando se pasa un SingularAttribute alrededor a través de parámetro de método.

    De crédito va para @Puede ÜNSAL que descubierto todo en esta pregunta: Hibernate/JPA – NullPointerException cuando se accede a SingularAttribute parámetro

  5. 0

    FYI, me he encontrado con un caso en el que Hibernate crea un metamodelo atributo, pero nunca se inicializa, que conduce a un NullPointerException‘s cuando se trata de utilizarla.

    public class Upper {
        public String getLabel() { return this.label; }
        public void setLabel(String label) { this.label = label; }
    }
    
    public class Lower extends Upper {
       @Override
       public String getLabel() { return super.getLabel(); }
    }

    Hibernate generar un label declaración de atributo en tanto clases:

    @Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
    @StaticMetamodel(Upper.class)
    public abstract class Upper_ {
        public static volatile SingularAttribute<Upper, String> label;
    }
    
    @Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
    @StaticMetamodel(Lower.class)
    public abstract class Lower_ {
        public static volatile SingularAttribute<Lower, String> label;
    }

    …y se inicializará Upper_.label pero dejar Lower_.label igual a null.

    Boom.

  6. 0

    La clase y el metamodelo debe estar en el mismo paquete, es decir,

    Carpeta de entidades:

    • Eje
    • Eje_
    • Elemento
    • Element_

    Os adjunto un ejemplo de metamodelo código

    import javax.annotation.Generated;
    import javax.persistence.metamodel.SetAttribute;
    import javax.persistence.metamodel.SingularAttribute;
    import javax.persistence.metamodel.StaticMetamodel;
    import java.util.Date;
    
    @Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
    @StaticMetamodel(Eje.class)
    public abstract class Eje_ {
        public static volatile SingularAttribute<Eje, Integer> id;
        public static volatile SingularAttribute<Eje, String> name;
        public static volatile SingularAttribute<Eje, Integer> users;
        public static volatile SingularAttribute<Eje, Date> createdAt;
        public static volatile SingularAttribute<Eje, Date> updatedAt;
        public static volatile SetAttribute<Eje, FactorCritico> factorCriticos;
    }
  7. 0

    Si nada de lo de arriba resolver este NPE problema, usted también puede comprobar si se está utilizando la Lista de sus Entidades de las relaciones en lugar de Establecer.

    Me enteré de que el uso de la Lista es necesario declarar ListAttribute en lugar de SetAttribute en el metamodelo, de lo contrario, provocar un NullPointerException y si usted no ve toda la traza de la pila usted no se dará cuenta de que el metamodelo no fue inicializada por su especificación JPA.

  8. 0

    2019-04-24

    El habitual problema para despoblada metamodelo los atributos de la clase, es cuando el metamodelo clases en un paquete diferente de la correspondiente clases administradas.

    La última, JPA 2.2 especificación todavía requiere para tener su metamodelo clases en el mismo paquete como su correspondiente clases administradas.

    Referencia: Página 238, §6.2.1.1 Canónica Metamodelo

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea