سؤال

لدينا جدول في نظامنا يخزن أزواج مفتاح/قيمة الموارد.هناك عمودين لتخزين القيمة;عمود فارتشار لقيم أصغر و كلوب لقيم أكبر.على الجانب جافا ، يتم إنشاء مثيل لها في واحدة من فئتين ، ستانداردرسورسيبوندليفالو أو لارجيريسورسيبوندليفالو ، ويستخدم عمود التمييز لتمييزها في جدول واحد:

<discriminator type="string">
    <column name="RESOURCE_TYPE" length="20" index="XIE1CPD_RESOURCE_BUNDLE_L_V"/>
</discriminator>
...
<subclass name="StandardResourceBundleValue" discriminator-value="STANDARD">
    <property name="messageValue" type="string" column="STD_MSG_VALUE" length="400"/>
</subclass>
<subclass name="LargeResourceBundleValue" discriminator-value="LARGE">
    <property name="messageValue" type="materialized_clob" column="LARGE_MSG_VALUE"/>
</subclass>

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

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

<property name="resourceType" type="string">
    <column name="RESOURCE_TYPE"/>
</property>    

عندما أحاول بناء الجدول ، أحصل على الخطأ التالي:

العمود المتكرر في رسم الخرائط للكيان:كوم.فو.ريسورسيبوندل.كبيرالمصدرعمود القيمة:نوع المورد (يجب تعيينه بإدراج = تحديث " خطأ " = "خطأ")

من الواضح أنه لا يفهم ما أحاول القيام به ، ولكن من المنطقي أنه يجب أن تكون هناك طريقة للقيام بذلك.إذا كيف يمكنك فضح حقل التمييز كخاصية?

شكرا.

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

المحلول

لا يمكنك فعل ذلك.يحتوي الكائن على نوع ، ولا يمكنه التبديل من نوع إلى آخر.هذا فقط كيف يعمل جافا.

أعتقد أنه لا ينبغي أن يكون لديك نوعان من الكيانات هنا.لماذا لا تقوم فقط بتخزين أداة التمييز كعمود تعداد أساسي ، وتخزين / جلب قيمة الخاصية في عمود فارتشار أو كلوب بناء على قيمة هذا التعداد.تأكد من تغليف كل شيء بشفافية في الكائن ، وسيكون كل شيء أسهل ، حتى بالنسبة للمتصلين.لا يمكن حتى نشر حقل التعداد.يمكنك استخدامه لتنفيذ getMessageValue() (احصل على القيمة من العمود المناسب) ، وقمت بتغيير قيمتها عندما setMessageValue() يسمى ، بناء على طول القيمة الجديدة.

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