Объявленные атрибуты Metamodel работают нормально, но унаследованные атрибуты метамодели являются NULL. Почему?
-
28-09-2019 - |
Вопрос
Я не могу запустить следующий тест: -
@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);
}
Это бросает NullPointerException в project.get(Project_.lifeCycle)
линия. Почему?
java.lang.NullPointerException
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)
Настойчивые возможности
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;
}
}
EntityLifecyclempl.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;
}
}
ПерсистентияBase_.java. (Сгенерировано с использованием гибернации метамоделированного генератора)
@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;
}
Настойчивость .xml. (Только разъясняющая часть)
<class>com.comp.timetracking.entity.PersistentEntityBase</class>
<class>com.comp.timetracking.entity.Project</class>
РЕДАКТИРОВАТЬ:Я использую Hibernate-entitymanager.3.6.0.Виналал и Hibernate-jpamodelgen.1.0.0.fin.
Редактировать 2@Pascal.
Я думаю, что Hibernate EM 3.6.0.ffinal позволяет нам определить @Embedded
Аннотированное поле @Entity
уровень, но он отрицает такое поле в @MappedSuperclass
уровень. Что ты говоришь?
Поскольку я не вижу «Вариант загрузки файлов» здесь, я загрузил TestCase в моей учетной записи ESNIPS. Скачать Maven-Project Project и Run SingularAttributeTest.java
. Отказ И оформить заказ консоли
ERROR main metamodel.MetadataContext:413 - Unable to locate static metamodel field : timetracking.entity.Employee_#lifeCycle
Нажмите на "Скачать Embedded-singular-attribute.zip.«Ссылка для загрузки файла без установки менеджера загрузки. (Если вы нажмете на Download link with Green arrow
, Вам придется установить менеджер загрузки !!)
Решение
Я проверил ваши классы и тестовый случай с EclipseLink (я удалил специфические части Hibernate) и тестовые пропускания. Но это действительно терпит неудачу с Hibernate 3.5.6. Выглядит как ошибка в гибернации.
Кстати, вы не хватаете Temporal
Аннотация в вашем Embeddable
@Column(name = "created_date")
@Temporal(TemporalType.DATE)
public Date getCreatedDate() {
return createdDate;
}
И вы не должны объявлять PersistentEntityBase
в persistence.xml
(Сопоставленный супер класс не является объектом).
Другие советы
У меня была такая же проблема: во время развертывания JBoss 7.0.2 сообщил о следующей ошибке: «Невозможно найти статическое поле Metamodel x», где X - это поле, унаследованное от @mappeSuperClass и аннотирован с @Embedded (тип X - это класс Аннотирован с @EMBedDable).
Я решил добавить классы, аннотируемые с @EMBEDDABLE и @MappeSuplacs, вместе с классами, аннотированными с @Entity, в списке классов, которые будут управляться единицей настойчивости. Это настроен в "persistence.xml
" файл.
Это не проблема.
Из Hibernate Documentation:
Если класс X расширяет другой класс S, где S является наиболее полученным управляемым классом (т. Е., Entity или сопоставленным суперклассом), расширенным на X, то класс X_ должен расширить класс S_, где S_ - это класс Metamodel, созданный для S.
https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/metamodel.html.