سؤال

أنا أبحث عن طريقة سهلة لتوسيع القائمة JPA رسم الخرائط.الفكرة هي كما يلي:

لدي الأذن المشروع مع EJB3+JPA الوحدة التي ClassA المشروح و تعيين الجدول class_a.ولكن أريد بعض النمطية الأخرى (آخر EJB وحدة) أن يكون ClassB الذي يضيف المزيد من خصائص ClassA (يمدد؟).

طريقة واحدة أن أنا على الرغم حول فقط إلى إضافة حقول إضافية إلى class_a الجدول وتشغيل غير HQL الاستفسارات لاسترداد البيانات.انها ليست جيدة كما يجب أن تفعل العديد من الأشياء باليد:نوع الخرائط عمود رسم الخرائط ، إلخ.

لقد فعلت الاختيار بسيطة ولكن يبدو أنني لا أستطيع تمديد ClassA في الوحدة الثانية (من ClassB) لأنها تستخدم مختلف EntityManagerFactories و بعض الفئات من الوحدة الأولى لا ينظر إلى الثانية والعكس بالعكس.

لقد رأيت بالفعل <jar-file> الوسم داخل persistence.xml.أنا بحاجة إلى شيء من هذا القبيل ، ولكن استخدام هذا يتطلب أن يكون هذا الملف المدرجة في الوحدة الأولى ويجب أن توجد (لن تخطي إذا لم يتم العثور على).هل هناك شيء من هذا القبيل ، التي يمكن وضعها على توسيع نطاق الوحدة (الثانية) لا للتمديد واحد (أول)?

إذا كان هناك وسيلة لتمديد JPA رسم الخرائط في وقت التشغيل سيكون أمرا رائعا.هل هناك مثل هذه الطريقة ؟ هل هناك حل آخر أن مشكلتي ؟

هل كانت مفيدة؟

المحلول

تنفيذ الحل هو كما يلي.لدي جرة واحدة واثنين EJB وحدات:

  1. الجرة هي قاعدة واحدة.فإنه يحمل قاعدة الكيانات المحلية واجهة التمديد:

    @Entity
    public class BaseEntity {
        public long id;
        @Id @GeneratedValue
        public long getId() {...
        ... other variables, getters, setters ...
    }
    
    @Local
    public interface EntitiyManagerWithExtendedEntitiesInterface {
        public EntityManager getEntityManager;
    }
    
  2. أول EJB وحدة واحدة من شأنها توسيع قاعدة الكيانات إضافة EJB للحصول على انها كيان مدير.هذه الوحدة تشمل أيضا persistence.xml مع <jar-file>../path_to_first_jar_file.jar</jar-file> خط.

    @Entity
    ... discriminator annotations
    public class ExtEntity extends BaseEntity {
        ... additional fields here
    }
    
    @Stateless
    public class EntitiyManagerWithExtendedEntitiesBean implements EntitiyManagerWithExtendedEntitiesInterface {
        @PersitenceContext
        EntityManager em;
        public EntityManager getEntityManager() {
            return em;
        }
    }
    
  3. الثاني EJB وحدة سوف يكون EJBs التي تحتاج فقط جرة تجميع ولكن تتطلب أولا EJB لتشغيل (تتطلب EJB التي سوف تنفذ EntitiyManagerWithExtendedEntitiesInterface واجهة).

    @Stateless
    public class getSomeEntity {
        @EJB
        EntitiyManagerWithExtendedEntitiesInterface ext;
        EntityManager em;
        @PostConstruct
        public void injectEntityManager() {
            em = ext.getEntityManager();
        }
        public void ejbInterfaceMethod() {
            ... method that uses em variable (EntityManager)
        }
    }
    

هذه الطريقة ملقم التطبيق سيكون لديك لإدارة التبعيات بين وحدات وأنا يمكن بسهولة مبادلة 1 EJB وحدة تشمل مجموعة أخرى من امتداد الكيانات.

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