Erklärt Metamodell Attribute Arbeit in Ordnung, aber Inherited Metamodel Attribute sind NULL. Warum?

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

Frage

Ich bin nicht in der Lage, den folgenden Test durchführen: -

@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);
}

wirft Nullpointer bei project.get(Project_.lifeCycle) Linie. Warum?

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 (generiert mit Hibernate Metamodel 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 (nur relavent Teil)

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

EDIT: Ich benutze hibernate-entitymanager.3.6.0.Final und hibernate-jpamodelgen.1.0.0.Final.

EDIT 2 @Pascal
Ich denke, Hibernate EM 3.6.0.Final ermöglicht es uns, @Embedded kommentierte Feld auf @Entity Ebene zu definieren, aber es leugnet solches Feld auf @MappedSuperclass Ebene. Was sagen Sie?

Da ich nicht „Datei-Upload-Option“ sehe hier habe ich die Testcase in meinem esnips hochgeladen Konto. Herunterladen die Maven-Based- Projekt und führen SingularAttributeTest.java. Und Kasse die Konsolenausgabe

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

Klicken Sie auf " Download embedded-singular-attribute.zip " Link, um die Datei ohne die Installation des Download-Manager zum Download bereit. (Wenn Sie auf Download link with Green arrow klicken, werden Sie den Download-Manager installieren müssen !!)

War es hilfreich?

Lösung

ich Ihre Klassen und Testfall mit Eclipse getestet (Ich entfernte die Hibernate spezifische Teile) und der Test bestanden. Aber es funktioniert nicht in der Tat mit Hibernate 3.5.6. Sieht aus wie ein Fehler in den Ruhezustand.

Übrigens, Sie sind eine Temporal Anmerkung in Ihrem Embeddable fehlt

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

Und Sie sollen nicht declare PersistentEntityBase im persistence.xml (ein zugeordnetes Superklasse ist keine Einheit).

Andere Tipps

Ich hatte das gleiche Problem: Während des Einsatzes der Jboss 7.0.2 die folgenden Fehler gemeldet: „Kann nicht statisch Metamodell Feld X lokalisieren“ wobei X ein Feld aus einem @ MappedSuperclass und kommentierte mit @Embedded (der Art von X ist eine Klasse kommentierte mit @Embeddable).

geerbt ist

Ich löste es die Klassen Zugabe kommentierten mit @Embeddable und @ MappedSuperclass zusammen mit den Klassen mit @Entity kommentiert, in der Liste der Klassen von der Persistenzeinheit verwaltet werden. Dies wird in der "persistence.xml" Datei konfiguriert.

Das ist kein Problem.

Von Hibernate Dokumentation:

  

Klasse Wenn X eine andere Klasse S erstreckt, wobei S die meisten abgeleitet verwalteten Klasse (dh Einheit oder kartiert geordnete Klasse) durch X ausgefahren, dann wird die Klasse X_ Klasse muss S_ erstrecken, wo S_ Metamodell-Klasse für S. erstellt ist

https://docs.jboss.org/ Hibernate / EntityManager / 3.5 / Referenz / en / html / metamodel.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top