代码之家  ›  专栏  ›  技术社区  ›  dira

声明的元模型属性工作正常,但继承的元模型属性为空。为什么?

  •  5
  • dira  · 技术社区  · 13 年前

    我无法运行以下测试:-

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

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

    实体生命周期impl.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;
    }
    

    }

    持久实体库java

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

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

    编辑2
    我认为Hibernate EM 3.6.0.Final允许我们定义 @Embedded 注释字段位于 @Entity 但它否认 @MappedSuperclass

    因为我在这里看不到“文件上传选项”,所以我已经在我的esnips帐户中上传了测试用例。 Download 基于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 ,您必须安装下载管理器!!)

    3 回复  |  直到 13 年前
        1
  •  6
  •   Pascal Thivent    13 年前

    我用EclipseLink(我删除了Hibernate特定部分)测试了您的类和测试用例,并通过了测试。但Hibernate3.5.6确实失败了。看起来像冬眠中的虫子。

    顺便说一下,你少了一个 Temporal Embeddable

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

    你不应该申报 PersistentEntityBase persistence.xml

        2
  •  1
  •   Andro Selva Yannick Chaze    11 年前

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

    persistence.xml “文件。

        3
  •  1
  •   Nikolay Shabak    9 年前

    这不是问题。

    从Hibernate文档:

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

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