قم بتعيين وقت الإنشاء وتحديثه باستخدام Hibernate في تعيينات XML

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

سؤال

أنا أستخدم السبات مع XML تعيينات. لدي كيان له حقلان تاريخ الإنشاء و تحديث من النوع timestamp, ، يجب ملؤها بوقت UTC الحالي عندما يتم استمرار الكيان وتحديثه. أنا أعرف عن وجود @PrePersist و @PreUpdate التعليقات التوضيحية ، لكنني لا أعرف كيفية استخدام ما يعادلها في تعيينات XML الخاصة بي.

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

شكرًا

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

المحلول

أنا أعرف عن وجود @PrePersist و @PreUpdate التعليقات التوضيحية ، لكنني لا أعرف كيفية استخدام ما يعادلها في تعيينات XML الخاصة بي.

و Hibernate3 بنية الحدث يوفر شيئًا مكافئًا ويمكنك تسجيل المستمعين PreInsertEvent, PreUpdateEvent أو SaveOrUpdateEvent (انظر org.hibernate.event حزمة للحصول على قائمة كاملة) لتعيين وتحديث تواريخ إنشاء/تحديث.

هناك نهج آخر هو استخدام اعتراض, ، أيضاً Session-scoped أو SessionFactory-scoped وضبط كليهما createDate و updateDate في onSave(...), ، تحديث updateDate في onFlushDirty(...).


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

يمكنك استخدام generated سمة من timestamp للحصول على creationDate و updateDate تم إنشاؤها بواسطة قاعدة البيانات على إدراج وإدراج وتحديث على التوالي:

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <timestamp name="createDate" generated="insert" ... />
  <timestamp name="updateDate" generated="always" ... />
  ...
</class>

الرجوع إلى القسم الخصائص المولدة للحصول على تفاصيل كاملة.

الخيار 1

يبدو أنه timestamp لا يدعم generatead لذا فإن اقتراحي لن يعمل. ومع ذلك ، بعد قراءة الوثائق بعناية أكبر ، أفهم ذلك timestamp هو بديل للإصدار ولا أعتقد أنه خيار مناسب لحقول مثل createDate و updateDate (قد يعمل في وقت لاحق ولكن هذا ليس ما timestamp هو ل).

لذلك ما زلت أستخدم في الواقع الخصائص المولدة لكن مع خصائص بسيطة بدلاً من timestamp:

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <property name="createDate" update="false" insert="false" generated="insert" ... />
  <property name="updateDate" update="false" insert="false" generated="always" ... />
  ...
</class>

على مستوى قاعدة البيانات ، سيتطلب ذلك استخدام مشغل ل updateDate عمودي. ل createDate العمود ، باستخدام شيء مثل current_timestamp كقيمة افتراضية ستعمل بشكل جيد. لكن المشغلات ربما لا تكون مطلوبة ...

الخيار 2

لتجنب مشغل الخيار 1, ، سيكون الاختلاف للاستخدام updateDate للإصدار (وبالتالي قم بتخطيطها كـ timestamp):

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <timestamp name="updateDate" ... />
  <property name="createDate" update="false" insert="false" generated="insert" ... />
  ...
</class>

نفس النهج مثل الخيار 1 ل createDate, ، استخدم قيمة افتراضية على مستوى قاعدة البيانات.

الخيار 3

انظر الجزء العلوي من هذه الإجابة ...

نصائح أخرى

يبدو أن الطوابع الزمنية في السبات يتم تحديثها تلقائيًا دائمًا عندما يتغير الكيان ، لذلك لا يمكنك استخدام ملف <timestamp> رسم الخرائط لتاريخ الخلق. ومع ذلك ، يمكنك تخزينه كبسيط java.util.Date خاصية ، تهيئتها مع new Date().

من أجل تحديث الطابع الزمني ، جرب هذا:

public class MyEntity {
  ...
  private Date updateDate;
  ...
}

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <timestamp name="updateDate" access="field" column="UPDATE_DATE"/>
  ...
</class>

لاحظ أن timestamp يجب أن يأتي بعد ذلك مباشرة id في التعيين.

لمعلوماتك هنا أ إشارة timestamp صفات.

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