هل من الممكن أن الجزء الأكبر من حذف ارتباط العديد-عديدة مع HQL؟
سؤال
وإذا كان الأمر كذلك، ما هو بناء الجملة؟
ونفترض أنني أريد مثيل فو أن يكون غير مرتبط من كافة مثيلات بار: في SQL سيكون ببساطة:
delete from FOO_BAR_MAPPING
where FOO_ID = ?
في HQL، أنا افترض أنه سيكون شيئا مثل:
delete from Bar.foos foos
where foos.id = :id
و(حيث فوس هي عبارة عن مجموعة من تعيين فو)
ولكن يبدو أن أكون مخطئا، وإعطاء:
org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped
هل هذا ممكن حتى مع HQL؟
المحلول
للرد على سؤال محدد الخاص بك، لا، بقدر ما أنا على علم أنه لا يمكن مع HQL.
وأعتقد أنك خلط SQL وHQL هنا قليلا. في SQL، كنت في الواقع "حذف" السجلات، وبالطبع السبات سوف تفعل في نهاية المطاف ذلك أيضا. ومع ذلك تم تصميم السبات / HQL من عقلية وجوه المنحى، وذلك "حذف" في هذا السياق يعني أنك تقوم بحذف الأشياء، وليس الجمعيات. وعادة ما كنت تفعل شيئا مثل يلي:
Foo f = session.get(Foo.class, id);
f.getBars().clear();
session.merge(f);
وهذا باسترداد الكائن بواسطة معرف الذي حددته، ويزيل جميع نقابات المحامين عن طريق مسح انها مجموعة. ومن الواضح أن لديك لجمعية فو-البارات المعينة في الاتجاه الصحيح لهذا العمل.
نصائح أخرى
وإزالة جمعيات وحده هو غير ممكن مع HQL. ما يمكنك القيام به، ومع ذلك، هو إما:
وأ) على افتراض كنت أفعل ذلك لفو واحد ويتم تعيين شلال بشكل مناسب، يمكنك تحميل هذا المثال Foo
، واضحة مجموعتها من bars
وحفظه.
B) إذا كنت تحاول مسح bars
من Foos
متعددة يمكنك تعيين استعلام SQL بدلا من HQL