تعمل سمات metamodel المعلنة بشكل جيد ولكن سمات metamodel الموروثة خالية. لماذا ا؟

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

يلقي nullpointerxception في project.get(Project_.lifeCycle) خط. لماذا ا؟

java.lang.NullPointerException
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:138)

الثبات

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

}

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

الثبات. 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.

تحرير 2pascal
أعتقد @Embedded الحقل المشروح في @Entity المستوى لكنه ينكر مثل هذا المجال في @MappedSuperclass مستوى. ماذا تقول؟

نظرًا لأنني لا أستطيع رؤية "خيار تحميل الملف" هنا ، فقد قمت بتحميل TestCase في حساب ESNIPS الخاص بي. تحميل المشروع القائم على 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 عن الخطأ التالي: "غير قادر على تحديد موقع Metamodel Field X" حيث يكون X حقلًا ورثًا من mappedsuperclass ومشروع مع embedded (نوع x هو فئة مشروح مع embeddable).

لقد قمت بحلها إضافة الفصول المشروطة مع embeddable و mappedsuperClass ، إلى جانب الفصول المشروحة مع entity ، في قائمة الفئات التي تديرها وحدة الثبات. تم تكوين هذا في "persistence.xml" ملف.

هذه ليست قضية.

من وثائق السبات:

إذا تمتد الفئة X إلى فئة S أخرى ، حيث تكون S هي الفئة الأكثر مشتقة (IE ، كيان أو طبقة فائقة المعينة) التي تم تمديدها بواسطة X ، فيجب على الفئة X_ تمديد الفئة S_ ، حيث S_ هي فئة Metamodel التي تم إنشاؤها لـ S.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top