الحصول على السبات للقيام التحديثات البسيطة، وبدلا من اختيار هائلة ثم التحديثات

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

سؤال

ويتيح الإعداد السؤال الأول.

ما لدي هو> الجداول 4: العملاء، العناوين، ترتيب، OrderItems. يتم تعيين كل استخدام السبات الشروح والوصول إليها من خلال طبقة الربيع DAO / الخدمات.

ما أحاول القيام به هو دمج العملاء مكررة معا. لذلك كل ما يحتاج حقا أن يحدث هو كل أوامر والعناوين المرتبطة مع العملاء B، تحتاج إلى تحديث المفتاح الخارجي CUSTOMER_ID بهم للإشارة إلى العملاء A. ثم العملاء B يجب أن يكون مجموعتها قليلا المعوقين.

وبدلا من إرسال هذه الاستعلامات بسيطة لقاعدة البيانات الخاصة بنا، السبات يذهب مجنون والقضايا طن من استعلامات التحديد ثم تحديث. خاصة وأنه يختار كل بنود النظام تعلق على النظام (لأن هذا هو تعريف EAGER، وهذه النقطة ليست قابلة للتغيير). للحصول على يختار قبل التحديث لوقف يحدث حاولت إضافة الشرح كيان السبات على رأس javax.persistence.Entity العادية مثل:

@org.hibernate.annotations.Entity(dynamicUpdate = true, selectBeforeUpdate = false, dynamicInsert = true)

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

وأحصل على الكائنات باستخدام معايير السبات التالية:

            Criteria c1 = null;
            Criteria c2 = null;
            Criteria c = session.createCriteria(Customer.class);
            c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

            if(resultLimit>0) c.setMaxResults(resultLimit);
            if(timeout>0) c.setTimeout(timeout);
            for(String filter: sqlFilters) {
                if(filter.indexOf("{alias}.customer_")!=-1) c.add(Restrictions.sqlRestriction(filter));
                else if(filter.indexOf("{alias}.address_")!=-1 && addrsAttached) {
                    if(c1==null)
                        c1 = c.createCriteria("addresses").setFetchMode("type", FetchMode.JOIN);
                    c1.add(Restrictions.sqlRestriction(filter));
                } else if(filter.indexOf("{alias}.order_")!=-1 && ordersAttached) {
                    if(c2==null)
                        c2 = c.createCriteria("orders").setFetchMode("orderItems", FetchMode.SELECT);
                    c2.add(Restrictions.sqlRestriction(filter));
                }
            }
            return (List<Customer>) c.list();

وبعد ذلك نقل كافة عنوان والنظام الكائنات من العملاء B إلى A العملاء وتشغيل

return (Customer) this.getHibernateTemplate().merge(customer);

وعلى كل الكائنات العملاء. هذا ينتهي خلق طن من عبارات SELECT التي تحصل على كافة الكائنات المرتبطة (أي OrderItems، المنتجات، ProductType، ProductPricingTmpl، الخ ..)

وأنا بحاجة للحصول على هذه يختار إزالتها! إذا لم تكن هناك سيكون الاستعلام تبدو طبيعية وتكون فعالة! الاستعلامات تحديث أنتج هي مثالية وحيوية.

وأي أفكار؟

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

المحلول

وربما تكون فكرة في اختيارك للدمج) عملية (. من جافادوك السبات:

<اقتباس فقرة>   

ونسخ حالة الكائن نظرا   على الكائن المستمر مع   نفس المعرف. إذا لم يكن هناك   المثال المستمرة حاليا   يرتبط مع الدورة، وسوف   تحميل.

وهكذا كنت اضطر السبات لتحميل كافة البيانات في قبل تعديله.

وحاول عملية مختلفة، مثل التحديث ():

<اقتباس فقرة>   

وتحديث مستمر مع المثال   المعرف من كتاب معين منفصلة   المثال.

لا وعود، على الرغم من قد تقرر السبات يحتاج لتحميله في أي حال. وdynamicUpdates = التكوين الصحيح قد يجعل الواقع أسوأ من ذلك، لأنه يحتاج إلى معرفة ما هناك أن تبدأ قبل أن تتمكن من إصدار التحديثات الحيوية.

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