2010-11-02 30 views
5

我不能夠運行下面的測試: -聲明的元模型屬性工作正常BUT繼承元模型屬性爲NULL。爲什麼?

@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)行拋出NullPointerException異常。爲什麼?

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(使用休眠元模型生成器生成的)

@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(僅relavent部分)

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

EDIT 2 @Pascal
我覺得休眠EM 3.6.0.Final使我們能夠在@Entity級別定義@Embedded註釋字段,但它在@MappedSuperclass水平否認這樣的領域。你說什麼?

因爲我在這裏看不到「文件上傳選項」,所以我在我的esnips帳戶中上傳了TestCase。 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,你將不得不安裝下載管理器!!)

+0

這個問題的副本: - https://forum.hibernate.org/viewtopic.php?f=1&t=1008173 – dira 2010-11-12 07:27:35

回答

6

我使用EclipseLink測試了你的類和測試用例(我刪除了Hibernate的特定部分)並通過了測試。但是,Hibernate 3.5.6確實失敗了。看起來像Hibernate中的一個bug。

順便說一句,你缺少一個Temporal註釋在Embeddable

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

而且你不應該宣佈在persistence.xmlPersistentEntityBase(映射超類不是一個實體)。

+0

+1你的意思我應該使用EclipseLink而不是Hibernate EM?並感謝有關@Temporal註釋的信息。 – dira 2010-11-12 07:27:02

+0

@ becomputer06:我基本上指出你的情況適用於RI,並且問題聽起來像是Hibernate中的一個錯誤,你應該報告它(用測試用例)。如果沒有人報告,錯誤將不會得到解決。但我不能說這個問題是否足以讓你證明移民到另一個提供者是合理的(沒有什麼阻止IMO,惱人的是,阻止否)。而其他提供者也不是沒有錯誤。您的電話:) – 2010-11-12 08:05:16

+0

結帳更新的問題。 (編輯2部分) – dira 2010-11-13 08:08:58

1

我有同樣的問題:在部署了JBoss 7.0.2報告下列錯誤: 「無法找到靜態元模型場X」 其中X是從@MappedSuperclass繼承與@Embedded註解一個字段( X的類型是用@Embeddable註解的類)。

我解決了它在由持久單元管理的類列表中添加用@Embeddable和@MappedSuperclass註解的類以及用@Entity註釋的類。這是在「persistence.xml」文件中配置的。

+1

@Andro Selva我在這裏也遇到了同樣的問題。在'@ Embeddable'類被註冊到'persistence.xml'文件後。 – Arunprasad 2014-10-08 06:49:20

相關問題