سؤال

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

على سبيل المثال, يقول لدي Shipment الكيان.في مرحلة ما بعد الشحن يتم إنشاؤه ، فإنه يحصل على شحنها.مرة واحدة يحصل على شحنها ، وهو يعبر عن عدد ولدت و تعيينه.البيان رقم تبدو شيئا مثل M000009 (حيث الاشياء بعد 'م' اليسرى مبطن قيمة من تسلسل).

كان شيئا من هذا القبيل طلب هنا في ذلك ولكن أنا لست مروحة من الحل لأنه يتطلب جدول آخر للحفاظ على يبدو غريبا العلاقة.

لا أحد يعرف إذا كان من الممكن استخدام شيء مثل هذا السبات MultipleHiLoPerTableGenerator شيء آخر غير معرف المولد ؟

إذا كان هذا غير ممكن, لا أحد يعرف من أي المكتبات التي تتعامل مع هذا (إما باستخدام السبات أو حتى مجرد محض JDBC).لا أفضل أن أكتب هذا بنفسي (و التعامل مع الجلب المسبق القيم تأمين التزامن).

شكرا

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

المحلول

أعتقد تعقيد المهمة الخاصة بك يعتمد على ما إذا كان أو لم يكن يعبر عن عدد يحتاج إلى أن تكون متتابعة:

  • إذا كنت لا تحتاج متتابعة تظهر الأرقام ثم إنها أيام سعيدة و يمكن استخدام سلسلة.
  • إذا كنت بحاجة متتابعة تظهر الأرقام (أو قاعدة البيانات الخاصة بك لا يدعم متواليات) ثم استخدام معرف الجدول مع تأمين المناسب بحيث كل معاملة يحصل فريدة من نوعها متتابعة القيمة.

ثم لديك 2 الخيارات التي يمكنني أن أفكر:

  • كتابة اللازمة JDBC على العميل ضمان (إذا كان يعبر عن رقم متسلسل) أن الصفقة التي يجري استخدامها هو نفس تحديث قاعدة البيانات.
  • استخدام تؤدي إلى خلق البيان الرقم عند الاقتضاء يحدث التحديث.

أعتقد أن الأفضلية ستكون على الزناد لأن المعاملة الجانب من الأشياء التي سوف تتخذ الرعاية من على الرغم من أن ذلك يعني كائن يحتاج منعش على العميل.

نصائح أخرى

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

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

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

وأود أيضا أن "مخبأ" متواليات. وأود أن عثرة قيمة تسلسل المخزنة من قبل عدد كبير، ومن ثم توزع هذه من تلك تسلسل المخصصة من صفي المولد. إذا تم تدمير الطبقة (أي التطبيق الاغلاق)، نسخة جديدة من مولد تسلسل سيبدأ العمل في القيمة المخزنة. (وجود فجوة في بلدي أرقام التسلسل لا يهم)

وهنا هو samnple التعليمات البرمجية. أود أن التحذير هذه مع - أنا لم comiled هذا وreuires كود الربيع. أما وقد قلت هذا يجب أن لا تزال توفر عظام ما تريد القيام به.

public Long getManifestNumber() {
        final Object result = getHibernateTemplate().execute(new HibernateCallback() {
            public Object doInHibernate(Session sess) throws HibernateException, SQLException { 
                SQLQuery sqlQuery = sess.createSQLQuery("select MY_SEQUENCE.NEXTVAL from dual");
                sqlQuery.uniqueResult();
            }
        });
        Long toReturn;
        if (result instanceof BigDecimal) {
            toReturn = ((BigDecimal)result).longValue();
        }
        return toReturn;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top