تمديد JPA الكيان الخرائط
سؤال
أنا أبحث عن طريقة سهلة لتوسيع القائمة JPA رسم الخرائط.الفكرة هي كما يلي:
لدي الأذن المشروع مع EJB3+JPA الوحدة التي ClassA المشروح و تعيين الجدول class_a.ولكن أريد بعض النمطية الأخرى (آخر EJB وحدة) أن يكون ClassB الذي يضيف المزيد من خصائص ClassA (يمدد؟).
طريقة واحدة أن أنا على الرغم حول فقط إلى إضافة حقول إضافية إلى class_a الجدول وتشغيل غير HQL الاستفسارات لاسترداد البيانات.انها ليست جيدة كما يجب أن تفعل العديد من الأشياء باليد:نوع الخرائط عمود رسم الخرائط ، إلخ.
لقد فعلت الاختيار بسيطة ولكن يبدو أنني لا أستطيع تمديد ClassA في الوحدة الثانية (من ClassB) لأنها تستخدم مختلف EntityManagerFactories و بعض الفئات من الوحدة الأولى لا ينظر إلى الثانية والعكس بالعكس.
لقد رأيت بالفعل <jar-file> الوسم داخل persistence.xml.أنا بحاجة إلى شيء من هذا القبيل ، ولكن استخدام هذا يتطلب أن يكون هذا الملف المدرجة في الوحدة الأولى ويجب أن توجد (لن تخطي إذا لم يتم العثور على).هل هناك شيء من هذا القبيل ، التي يمكن وضعها على توسيع نطاق الوحدة (الثانية) لا للتمديد واحد (أول)?
إذا كان هناك وسيلة لتمديد JPA رسم الخرائط في وقت التشغيل سيكون أمرا رائعا.هل هناك مثل هذه الطريقة ؟ هل هناك حل آخر أن مشكلتي ؟
المحلول
تنفيذ الحل هو كما يلي.لدي جرة واحدة واثنين EJB وحدات:
الجرة هي قاعدة واحدة.فإنه يحمل قاعدة الكيانات المحلية واجهة التمديد:
@Entity public class BaseEntity { public long id; @Id @GeneratedValue public long getId() {... ... other variables, getters, setters ... } @Local public interface EntitiyManagerWithExtendedEntitiesInterface { public EntityManager getEntityManager; }
أول 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; } }
الثاني 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 وحدة تشمل مجموعة أخرى من امتداد الكيانات.