Déclaré métamodèle attributs fonctionnent bien, mais Attributs hérités métamodèle sont NULL. Pourquoi?

StackOverflow https://stackoverflow.com/questions/4077075

Question

Je ne suis pas en mesure d'exécuter le test suivant: -

@Test
public void test() {
    EntityManager em = entityManagerFactory.createEntityManager();
    em.getTransaction().begin();

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Project> query = builder.createQuery(Project.class);

    Root<Project> project = query.from(Project.class);

    Path<String> name = project.get(Project_.name);
    Assert.assertNotNull(name);

    Path<EntityLifeCycleImpl> lifeCycle = project.get(Project_.lifeCycle); // problem is here, throws NullPointer
    Assert.assertNotNull(lifeCycle);
}

il jette NullPointerException à la ligne de project.get(Project_.lifeCycle). Pourquoi?

java.lang.NullPointerException
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)

PersistenceEntityBase.java

import org.hibernate.annotations.GenericGenerator;
        @MappedSuperclass
@Access(AccessType.PROPERTY)
public abstract class PersistentEntityBase {

protected String identifier;

protected EntityLifeCycleImpl lifeCycle = new EntityLifeCycleImpl();

protected PersistentEntityBase() {
}

@Id
@GeneratedValue(generator="generator") 
@GenericGenerator(name="generator", strategy="guid", parameters = {})
@Column(name="identifier")
public String getIdentifier() {
    return identifier;
}

public void setIdentifier(String identifier) {
    this.identifier = identifier;
}

@Embedded
public EntityLifeCycleImpl getLifeCycle() {
    return lifeCycle;
}
public void setLifeCycle(EntityLifeCycleImpl lifeCycle) {
    this.lifeCycle = lifeCycle;
}

}

Project.java

@Entity
@Table(name="project")
@Access(AccessType.PROPERTY)
public class Project extends PersistentEntityBase {

    private String name;

    protected Project() {
    }

    public Project(String name) {
        this();
        this.name = name;
    }

    @Column(name="name", nullable=false, unique=true)
    public String getName() {
        return name;
}
public void setName(String name) {
    this.name = name;
}

}

EntityLifeCycleImpl.java

@Embeddable
public class EntityLifeCycleImpl implements EntityLifeCycle {
    private String createdBy;
    private Date createdDate;
       @Column(name="created_by")
public String getCreatedBy() {
    return createdBy;
}
public void setCreatedBy(String createdBy) {

    this.createdBy = createdBy;
}

@Column(name="created_date")
public Date getCreatedDate() {
    return createdDate;
}
public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
}

}

PersistentEntityBase_.java (générés en utilisant Hibernate métamodèle Generator)

   @StaticMetamodel(PersistentEntityBase.class)
public abstract class PersistentEntityBase_ {
    public static volatile SingularAttribute<PersistentEntityBase, EntityLifeCycleImpl> lifeCycle;
        public static volatile SingularAttribute<PersistentEntityBase, String> identifier;
     }

Project_.java

    @StaticMetamodel(Project.class)
public abstract class Project_ extends PersistentEntityBase_ {
    public static volatile SingularAttribute<Project, String> name;
    }

EntityLifeCycleImpl_.java

   @StaticMetamodel(EntityLifeCycleImpl.class)
public abstract class EntityLifeCycleImpl_ {
    public static volatile SingularAttribute<EntityLifeCycleImpl, String> createdBy;
    public static volatile SingularAttribute<EntityLifeCycleImpl, Date> createdDate;
}

persistence.xml (seule une partie relavent)

<class>com.comp.timetracking.entity.PersistentEntityBase</class>
<class>com.comp.timetracking.entity.Project</class>

EDIT: J'utilise hibernate-entitymanager.3.6.0.Final et hibernate-jpamodelgen.1.0.0.Final.

EDIT 2 @Pascal
Je pense que Hibernate EM 3.6.0.Final nous permet de définir le terrain annoté @Embedded au niveau @Entity mais refuse un tel champ au niveau de @MappedSuperclass. Que dites-vous?

Comme je ne peux pas voir « l'option de téléchargement de fichiers » ici, je l'ai téléchargé le TestCase dans mes esnips compte. Télécharger maven-base- projet et exécuter SingularAttributeTest.java. Et la caisse de la sortie de la console

ERROR main metamodel.MetadataContext:413 - Unable to locate static metamodel field : timetracking.entity.Employee_#lifeCycle

Cliquez sur « Télécharger embedded-singular-attribute.zip » lien pour télécharger le fichier sans installer le gestionnaire de téléchargement. (Si vous cliquez sur Download link with Green arrow, vous devez installer le gestionnaire de téléchargement !!)

Était-ce utile?

La solution

Je l'ai testé vos classes et cas de test avec EclipseLink (j'ai enlevé les pièces spécifiques Hibernate) et le test passe. Mais il échoue en effet avec Hibernate 3.5.6. On dirait un bogue dans Hibernate.

Par ailleurs, il vous manque une annotation Temporal dans votre Embeddable

@Column(name = "created_date")
@Temporal(TemporalType.DATE)
public Date getCreatedDate() {
    return createdDate;
}

Et vous n'êtes pas censé PersistentEntityBase annoncez dans la persistence.xml (une super classe mappée est pas une entité).

Autres conseils

J'ai eu le même problème: Au cours du déploiement du jboss 7.0.2 signalé l'erreur suivante: « Impossible de trouver le champ métamodèle statique X » où X est un champ hérité d'un @MappedSuperclass et annoté avec @Embedded (le type de X est une classe annotée avec @Embeddable).

Je l'ai résolu en ajoutant les classes annotées avec @Embeddable et @MappedSuperclass, ainsi que les classes annotées avec @Entity, dans la liste des classes à gérer par l'unité de persistance. Ceci est configuré dans le fichier « persistence.xml ».

ce n'est pas un problème.

De la documentation Hibernate:

  

Si la classe X étend une autre classe S, où S est la classe gérée plus dérivée (c.-à-entité ou superclasse cartographié) prolongée par X, puis la classe X_ doit étendre la classe S_, où S_ est la classe métamodèle créé pour S.

https://docs.jboss.org/ mise en veille prolongée / entitymanager / 3,5 / référence / fr / html / metamodel.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top