宣言されたメタモデル属性は正常に機能しますが、継承されたメタモデル属性はヌルです。なんで?

StackOverflow https://stackoverflow.com/questions/4077075

質問

次のテストを実行できません。-

@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ジェネレーターを使用して生成)

   @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 (再生部分のみ)

<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アカウントにテストケースをアップロードしました。 ダウンロード 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, 、ダウンロードマネージャーをインストールする必要があります!!)

役に立ちましたか?

解決

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のタイプはクラスです。 @embeddableで注釈付き)。

@embeddableと @mappedsuperclassで注釈が付けられたクラスを追加し、 @Entityが注釈されたクラスとともに、Persistenceユニットが管理するクラスのリストに追加しました。これは「」で構成されています。persistence.xml" ファイル。

これは問題ではありません。

Hibernateのドキュメントから:

クラスXが別のクラスsを拡張し、SがXで拡張された最も派生マネージャークラス(つまり、エンティティまたはマッピングされたスーパークラス)である場合、クラスX_はクラスS_を拡張する必要があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top