5

我无法运行以下测试:-

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

}

项目.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 元模型生成器生成)

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

项目_.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(仅相关部分)

<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.Final。

编辑 2 @Pascal
我认为 Hibernate EM 3.6.0.Final 允许我们在级别定义带@Embedded注释的字段,@Entity但它在级别拒绝此类字段@MappedSuperclass。你说什么?

由于我在这里看不到“文件上传选项”,我已经在我的 esnips 帐户中上传了 TestCase。下载基于 maven 的项目并运行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,你必须安装下载管理器!!)

4

3 回答 3

6

我用 EclipseLink 测试了你的类和测试用例(我删除了 Hibernate 的特定部分)并且测试通过了。但它确实在 Hibernate 3.5.6 中失败了。看起来像 Hibernate 中的一个错误。

顺便说一句,你Temporal在你的Embeddable

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

而且您不应该PersistentEntityBasepersistence.xml(映射的超类不是实体)中声明。

于 2010-11-02T16:12:38.830 回答
2

这不是问题。

从休眠文档:

如果类 X 扩展了另一个类 S,其中 S 是由 X 扩展的最派生的托管类(即实体或映射超类),则类 X_ 必须扩展类 S_,其中 S_ 是为 S 创建的元模型类。

https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/metamodel.html

于 2014-10-29T20:00:35.820 回答
1

我遇到了同样的问题:在部署期间,jboss 7.0.2 报告了以下错误:“无法找到静态元模型字段 X”其中 X 是从 @MappedSuperclass 继承并使用 @Embedded 注释的字段(X 的类型是类用@Embeddable 注释)。

我解决了这个问题,在持久性单元管理的类列表中添加了@Embeddable 和@MappedSuperclass 注释的类,以及@Entity 注释的类。这是在“ persistence.xml”文件中配置的。

于 2011-12-28T15:36:13.187 回答