في هذا السياق، يظهر أنك تواجه مشكلة مع Lombok.hashCode عند تنفيذ bookService.save(bookForm.getBook())
، حيث يتم إحداث تكرار لا نهائي يؤدي في النهاية إلى java.lang.StackOverflowError. هذا يشير إلى أن هناك دورة لامتناهية في توليد تابع hashCode بين كائني الكتاب (Book) وتفاصيل الكتاب (BookDetail).
لفهم هذا الخطأ بشكل أفضل، يجب أن نلقي نظرة على كيف يتم توليد hashCode بواسطة Lombok. في كودك، يتم استخدام Lombok لإنشاء تابع hashCode في كل من الفئتين (Book و BookDetail)، ولكن يبدو أن هناك تبادل تبادلي للمراجع بين الكائنين.
لحل هذه المشكلة، يمكنك إما تجاوز تابع hashCode في إحدى الفئتين أو كلاهما. يمكنك فعل ذلك بإضافة تابع hashCode
في الكلاسين وتجاوزه بشكل يمنع الدوران التالي:
java@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
// ... الشيفرة الحالية ...
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
@Entity
@Table(name = "book_detail")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BookDetail {
// ... الشيفرة الحالية ...
@Override
public int hashCode() {
return Objects.hash(id, numberOfPages);
}
}
بتحديد مجموعة محددة من الحقول لتوليد التابع hashCode، يمكنك تجنب الدوران اللامتناهي والخطأ الناتج عن ذلك. يمكنك تعديل تلك الأسطر في كل فئة وتضمين الحقول التي تعتبرها ذات أهمية لعملية مقارنة hashCode.
بتنفيذ هذا التغيير، يجب أن تكون قادرًا على تجنب الخطأ الذي تواجهه عند حفظ الكتاب.
المزيد من المعلومات
في هذا السياق، يبدو أن المشكلة تتعلق بالتكرار اللامتناهي في توليد تابع hashCode
، والذي يؤدي إلى استنفاد ستاك التراكم وإثارة استثناء java.lang.StackOverflowError
. هذا يحدث عندما يقوم كل من كائني الكتاب (Book
) وتفاصيل الكتاب (BookDetail
) بالاستدعاء المتبادل لتابع hashCode
الذي يولده Lombok.
لحل هذه المشكلة، يُفضل تجاوز تابع hashCode
في كل من الفئتين (Book
و BookDetail
) بشكل صحيح لتجنب هذا الدوران اللامتناهي. يمكنك استخدام أسلوب مخصص لتوليد قيمة hashCode
باستخدام مجموعة محددة من الحقول المميزة في كل كائن. في المثال السابق، قمت بتجاوز التابع hashCode
في الفئتين بطريقة تأخذ في اعتبارها الحقول id
و name
في Book
، والحقول id
و numberOfPages
في BookDetail
.
يمكنك أيضًا استخدام مكتبة Objects
في Java لتوليد قيمة hashCode
بشكل أكثر أمانًا، كما هو موضح في الشيفرة السابقة.
تحتاج أيضًا إلى التحقق من تنسيق البيانات المدخلة من قبل النموذج (BookForm
) للتأكد من أن جميع الحقول تتم ملئها بشكل صحيح قبل تنفيذ bookService.save(bookForm.getBook())
.
باستخدام هذا الحل، يجب أن يتم تجنب الدوران اللامتناهي ويمكنك حفظ الكتب بنجاح دون الحصول على خطأ StackOverflowError
.