سؤال

لدي فئة سباتات هي في الأساس مجرد غلاف حول الكثير من الأحمال من المجموعات.

لذلك فئة (مبسطة بشكل كبير / الزائفة) شيء مثل:

entity class العام myclass {@ onetomany map1 @ onetomany map2 @ onetomany map3 addtomap1 ()؛ addtomap2 ()؛ addtomap3 ()؛ إزالة Frommap1 ()؛ إزالة Frommap2 ()؛ إزالة Frommap3 ()؛ dowhaterwithmap1 ()؛ dowhaterwithmap2 ()؛ dowhaterwithmap3 ()؛ }

إلخ. يحتوي كل من هذه الخرائط بعد ذلك على عدد قليل من الطرق المرتبطة بها (إضافة / إزالة / الاستجواب / إلخ).

كما يمكنك أن تتخيل، بحلول الوقت الذي أضفته المجموعة العاشرة أو نحو ذلك، فإن الفئة يحصل على حجم مثير للسخرية.

ما أحب أن أفعله هو شيء على غرار:

 entity الطبقة العامة myclass {classwrophapphapmap1؛ ClassWRappingMap2؛ classwrophapphapmap3؛ }

مع كل الطرق المختلفة ملفوفة في تلك الفئات:

ClassWrophapphapphapphappraphappringmap1 {@ onetomany خريطة addtomap ()؛ إزالة frommap ()؛ dowhaterwithmap ()؛ }

فكرت ربما أستطيع استخدامها @Embedded لذلك، لكنني لا يبدو لي أن أتمكن من الحصول عليها للعمل (السبات ببساطة لا يحاول حتى أن يستمر في الخريطة داخل Wrapperclass).

هل فعل أي شخص مثل هذا من قبل؟ أي تلميحات؟

شكرا جزيلا،
نيد

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

المحلول

دليل السبات لشروح الدول التالية:

على الرغم من عدم دعمها من خلال مواصفات EJB3، تتيح لك التعليقات التوضيحية السبات استخدام التعليقات التوضيحية للجمعية في كائن قابل للتمرين (IE @ * Toone Not * Tomany). لتجاوز أعمدة الرابطة، يمكنك استخدام AassociousoverRide.

لذلك يجب أن تعمل نهج التفاف الخاص بك.


بادئ ذي بدء، يجب عليك التحقق من جميع ملفات السجل وغيرها لأي أخطاء ذات صلة.

يمكنك تجربة شيء مثل هذا:

  • في الفئة الرئيسية الخاصة بك (myclass)
entity class العام myclass {@ embedded classwrophapphapmap1 map1؛ }
  • وفي فئة التفاف الخاصة بك
@ embeddable الطبقة العامة Classwraphapmap1 {@ Onetomany خريطة Map1؛ }

لاحظ أن ClassWrappingMap1 الاستخدامات @Embeddable حاشية. ملاحظة. ومع ذلك، وفقا لمستندات embedDable يجب ألا تكون هناك حاجة إلى التوضيح

تأكد من أن كل فئة ClassWrophapphapmap خرائط عمود مختلف في قاعدة البيانات. كما يجب ألا يكون فئات Rapprophapphapptmap مفتاح أساسي (@Id أو @EmbeddedId أعمدة).

نصائح أخرى

على الرغم من أنني لا أعرف استراتيجية افتراضية عند استخدام فئة Wrapper، يمكنك استخدام اعتراضية السبات لتهيئة المجمع الخاص بك عن طريق تجاوز Onload. طريقة. شيء مثل

public class WrapperInterceptor extends EmptyInterceptor {

    private Session session;

    public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
        if (entity instanceof MyClass) {
             MyClass myClass = (MyClass) entity;

             Query query = session.createQuery(<QUERY_TO_RETRIEVE_WRAPPED_ENTITY_GOES_HERE>);

             WrappedEntity wrappedEntity = query.list().get(0);

             myClass.setWrapperClass(new WrapperClass(wrappedEntity));
        }
    }

    public void setSession(Session session) {
        this.session = session;
    }
}

يعتني بما يلي:

يجب على العميل باستخدام هذا الاعتراضي تعيين خاصية الجلسة

لذلك يبدو رمزك مثل هذا

WrapperInterceptor interceptor = new WrapperInterceptor();

Session session = sessionFactory().openSession(interceptor);

Transaction tx = session.beginTransaction();

interceptor.setSession(session);

MyClass myClass = (MyClass) session.get(newItem, myClassId); // Triggers onLoad event

tx.commit();
session.close();

أو استخدم ربيع AOP للقيام بالمهمة نفسها. يرى تصميم مدفوع المجال مع الربيع والإسبات

إذا كنت تعرف استراتيجية أخرى، شاركها معنا.

مع تحياتي،

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