قم بتعيين وقت الإنشاء وتحديثه باستخدام Hibernate في تعيينات XML
-
26-09-2019 - |
سؤال
أنا أستخدم السبات مع 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
صفات.