هل يحتاج السبات دائمًا إلى جهاز عند وجود getter؟

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

  •  28-09-2019
  •  | 
  •  

سؤال

لدينا بعض أساليب getter السباتية المشروحة مع كليهما @Column و @Basic.

نحصل على استثناء إذا لم يكن لدينا Setter المقابل. لماذا هذا؟

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

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

المحلول

كما ذكر آخرون ، إذا قمت بتعليق طريقة Getter Property ، فإن Hibernate يستخدم Setter عند قراءة القيم من قاعدة البيانات. في الأساس ، يفترض Hibernate أن أي شيء يكتب إلى قاعدة البيانات سيحتاج في النهاية إلى قراءة قاعدة البيانات. هذا يعني أنه إذا قمت بتعليق getter ، فعندئذٍ يحتاج إلى استدعاء Setter عند قراءة الكائن من قاعدة البيانات.

يمكنك جعل Setter Private (سوف تستخدم Hibernate الانعكاس للوصول إلى Setter). هذه طريقة رائعة للحفاظ على عقد صفك مع الاستمرار في استخدام السبات لرسم الخرائط العلائقية.

إذا كان الحقل مشتقًا من خصائص أخرى في الفصل ، فلماذا تخزينه في قاعدة البيانات؟ يمكنك استخدام ال @Transient التعليق التوضيحي لوضع علامة على الحقل الذي لا ينبغي تخزينه في قاعدة البيانات. يمكنك حتى استخدام @Formula التعليقات التوضيحية لاستخلاص سبات الحقل لك (يفعل ذلك باستخدام الصيغة في الاستعلام الذي يرسله إلى قاعدة البيانات).

نصائح أخرى

يجب عليك التعليق على فصولك مع @Entity(access = AccessType.FIELD) وشرح سماتك. هذا يجب ان يحل مشكلتك. The Setter هو أفضل طريقة لدعم إعادة إعادة البناء. وما هي المشكلة في وجود الوضع الصغير هناك.

تعيين access="field" إذا كنت لا تريد استخدام المستقلين:

<class name="com.demo.hibernate.Country" table="country">
  <id name="countryId" column="id" type="int">
    <generator class="increment" />
  </id>
  <property name="name" column="name" access="field" type="string" />
  <property name="countryCode" column="country_code" access="field" type="string" />
</class>

يستخدم السبات set طريقة لتهيئة الكيان الذي تقرأه من ديسيبل.

ربما ، إذا قمت بإجراء معدلات الوصول لحقول الكيان default أو protected أو public ثم ستقوم Hibernate بتهيئة الحقول مباشرة دون استخدام Setter (قرأت شيئًا عنها ولكني لست متأكدًا من أنه يعمل). ولكن استخدام Setter هو أكثر بكثير طريقة مفضلة.

إذا كنت لا تستخدم المستقلين واستخدمت سمات خاصة ، فسيتعين على السبات إلى استرداد الحقول عن طريق التأمل و do field.setAccable (صحيح). لا أعتقد أن السبات يفعل ذلك.

لا أعرف حقًا ما إذا كان بإمكاننا أن نقول إلى السبات للقيام بذلك ، ولكن بقدر ما أتذكر ، فإن التكوين الافتراضي يستخدم المستقلين ... ضع سجل/نظام على مجموعة وسترى أنه يستخدم Setter.

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