Erklärt Metamodell Attribute Arbeit in Ordnung, aber Inherited Metamodel Attribute sind NULL. Warum?
-
28-09-2019 - |
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 !!)
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