it-swarm.asia

ماذا تفعل EntityManager.flush ولماذا أحتاج إلى استخدامه؟

لدي EJB حيث أقوم بحفظ كائن إلى قاعدة البيانات. في مثال رأيته ، بمجرد حفظ هذه البيانات (EntityManager.persist) ، توجد دعوة إلى EntityManager.flush () ؛ لماذا أحتاج إلى القيام بذلك؟ الكائن الذي أحفظه غير مرفق ولا يُستخدم لاحقًا في الطريقة. في الواقع ، بمجرد حفظ الطريقة التي يتم إرجاعها وأتوقع أن يتم إصدار الموارد. (رمز المثال يفعل ذلك في مكالمة إزالة أيضًا.)

if (somecondition) {
    entityManager.persist(unAttachedEntity);
} else {
    attachedEntityObject.setId(unAttachedEntity.getId());
}
entityManager.flush();
53
spartikus

استدعاء EntityManager.flush(); يفرض أن تكون البيانات موجودة في قاعدة البيانات فورًا لأن EntityManager.persist() لن (وفقًا لكيفية تكوين EntityManager: FlushModeType (AUTO أو COMMIT) بشكل افتراضي ، يتم ضبطه على AUTO وسيتم إجراء تدفق تلقائيًا إذا تم تعيينه على COMMIT ، حيث سيتم تأخير استمرار البيانات في قاعدة البيانات الأساسية عند الالتزام بالمعاملة).

46
Benoit Wickramarachi

يمكن استخدام العملية EntityManager.flush() لكتابة جميع التغييرات على قاعدة البيانات قبل الالتزام بالمعاملة. بشكل افتراضي ، لا يكتب JPA التغييرات في قاعدة البيانات حتى يتم الالتزام بالمعاملة. هذا أمر مرغوب فيه عادة لأنه يتجنب الوصول إلى قاعدة البيانات والموارد والأقفال حتى مطلوب. كما أنه يسمح بطلب عمليات كتابة قاعدة البيانات ، ويتم تجميعها للوصول الأمثل لقاعدة البيانات ، وللحفاظ على قيود التكامل وتجنب الجمود. هذا يعني أنه عند استدعاء استمرار ، دمج ، أو إزالة قاعدة البيانات DML INSERT ، UPDATE ، DELETE لا تنفذ ، حتى الالتزام ، أو حتى يتم تشغيل تدفق.

17
Md Alauddin Hossain

EntityManager.persist() يجعل الكيان ثابتًا بينما EntityManager.flush() يقوم فعلًا بتشغيل الاستعلام في قاعدة البيانات الخاصة بك.

لذلك ، عند استدعاء EntityManager.flush() ، يتم تنفيذ استعلامات لإدراج/تحديث/حذف الكيانات المرتبطة في قاعدة البيانات. ستعرف أي إخفاقات قيد (عرض العمود ، أنواع البيانات ، المفتاح الخارجي) في هذا الوقت.

يعتمد السلوك الملموس على ما إذا كان وضع التدفق هو AUTO أو COMMIT.

17
Sachin Thapa

لذلك عندما تقوم باستدعاء EntityManager.persist() ، فإنها تجعل الكيان فقط يدار بواسطة EntityManager ويضيفه (مثيل الكيان) إلى Persistence Context. سيجعل _ Explicit flush() الكيان الموجود الآن في Persistence Context ليتم نقله إلى قاعدة البيانات (باستخدام SQL).

بدون تدفق () ، سيحدث هذا (نقل الكيان من Persistence Context إلى قاعدة البيانات) عندما تلتزم المعاملة التي يرتبط بها Persistence Context.

10
Arun