声明的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)
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 (使用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;
}
持久性。xml (仅雷片零件)
<class>com.comp.timetracking.entity.PersistentEntityBase</class>
<class>com.comp.timetracking.entity.Project</class>
编辑:我使用Hibernate-entityManager.3.6.0.-Final和Hibernate-Jpamodelgen.1.0.0.dinal。
编辑2@Pascal
我认为Hibernate EM 3.6.0.最终允许我们定义 @Embedded
注释的字段 @Entity
级别,但它否认了这样的领域 @MappedSuperclass
等级。你说什么?
由于我在这里看不到“文件上传选项”,因此我已经在ESNIPS帐户中上传了TestCase。 下载 基于Maven的项目并运行 SingularAttributeTest.java
. 。并结帐控制台输出
ERROR main metamodel.MetadataContext:413 - Unable to locate static metamodel field : timetracking.entity.Employee_#lifeCycle
点击 ”下载嵌入式singular-attribute.zip“链接以下载文件而不安装下载管理器。(如果您单击 Download link with Green arrow
, ,您必须安装下载管理器!!)
解决方案
我使用Eclipselink(我删除了特定的零件)和测试通过测试了您的课程和测试用例。但这确实是冬眠3.5.6失败的。看起来像是冬眠中的错误。
顺便说一句,你错过了 Temporal
您的注释 Embeddable
@Column(name = "created_date")
@Temporal(TemporalType.DATE)
public Date getCreatedDate() {
return createdDate;
}
而且您不应该声明 PersistentEntityBase
在里面 persistence.xml
(映射的超级类不是实体)。
其他提示
我遇到了同样的问题:部署期间JBOSS 7.0.2报告了以下错误:“无法找到静态元模型字段x”其中x是从@mappedsuperclass继承的字段,并用@embedded进行了注释(x的类型是class class class用@embeddable注释)。
我解决了它添加了用@embeddable和@mappedsuperclass注释的类,以及@Entity注释的类,在由持久性单元管理的类中。这是在“persistence.xml
“ 文件。
这不是问题。
来自Hibernate文档:
如果X类扩展了另一个类S,其中S是X扩展到X扩展的最派生的托管类(IE,实体或映射的超类),则类X_必须扩展class s_,其中S_是为S创建的MetAmodel类。
https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/metamodel.html