سؤال

ولدي فئتين كيان المشروح بالطريقة التالية

@Entity
class A {
   @ManyToMany(mappedBy="A", cascade=CascadeType.ALL)
   private List<B> b;
 ..
}

@Entity
class B {
   @ManyToMany(cascade=CascadeType.ALL)
   private List<A> a;
 ..
}

إذا كنت تخزين مثيل من فئة 'B'، يتم تخزين العلاقات في قاعدة البيانات وجالبة في الدرجة 'A' سيعود فرعية الصحيحة لB. ومع ذلك، إذا قمت بعمل تعديلات على قائمة إفطار في 'A'، لا يتم تخزين التغييرات في قاعدة البيانات؟

وسؤالي هو: كيف يمكنني أن أجعل من ذلك أن التغييرات في أي الطبقة هي "تتالي" إلى فئة أخرى؟

وتحرير: لقد حاولت أشكال مختلفة من إزالة mappedBy المعلمة وتحديد JoinTable (والأعمدة)، ولكني لم تتمكن من العثور على التركيبة الصحيحة

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

المحلول

وأقصر يبدو أن الإجابة لا يمكنك وكان من المنطقي. في ثنائية الاتجاه جمعية كثير لكثير يجب أن يكون جانب واحد رئيسي ويستخدم لتستمر تغييرات على الكامنة وراء انضمام الجدول. وكما JPA ليس الحفاظ على جانبي الجمعية، قد ينتهي بك المطاف مع الوضع الذاكرة التي لا يمكن إعادة شحنها مرة واحدة المخزنة في قاعدة البيانات. مثال:

A a1 = new A();
A a2 = new A();
B b = new B();
a1.getB().add(b);
b.getA().add(a2);

إذا يمكن استمرت هذه الحالة، سوف ينتهي بك الأمر مع الإدخالات التالية في الجدول الانضمام:

a1_id, b_id
a2_id, b_id

ولكن على تحميل، كيف JPA تعرف أنك تهدف إلى السماح فقط ب تعرف عن A2 و لا A1؟ وماذا عن A2 التي لا يجب أن تعرفه عن ب؟

وهذا هو السبب لديك للحفاظ على رابطة ثنائية الاتجاه نفسك (وجعل المثال أعلاه المستحيل للوصول الى، حتى في الذاكرة) وسوف تستمر النقابة فقط استنادا إلى حالة من جانب واحد منه.

نصائح أخرى

هل تحديد معكوس الانضمام الأعمدة؟

@Entity
class A {
   @ManyToMany(mappedBy="A", cascade=CascadeType.ALL)
   private List <B> b;
   ..
}

@Entity 
class B { 
   @ManyToMany 
   @JoinTable (
       name="A_B",
       joinColumns = {@JoinColumn(name="A_ID")},
       inverseJoinColumns = {@JoinColumn(name="B_ID")}
   )
   private List<A> a; 
   .. 
} 

وهذا على افتراض طاولة الانضمام دعا A_B مع الأعمدة A_ID وB_ID.

<اقتباس فقرة>   

وبما أن العلاقة ثنائية الاتجاه حتى تحديثات التطبيق   جانب واحد من العلاقة، والجانب الآخر يجب أيضا الحصول على تحديث،   ويكون في التوافق. في نقابة الصحفيين، كما هو الحال في جافا بشكل عام على هو   مسؤولية التطبيق أو طراز كائن للحفاظ على   العلاقات. إذا يضيف التطبيق الخاص بك لجانب واحد من   العلاقة، فإنه يجب إضافة إلى الجانب الآخر.

     

ويمكن حلها من خلال هذه الإضافة أو مجموعة الأساليب في طراز كائن   التي تتعامل مع كلا الجانبين من علاقات، وبالتالي فإن رمز التطبيق   لا داعي للقلق حول هذا الموضوع. هناك طريقتان للذهاب حول هذا الموضوع،   يمكنك إما فقط بإضافة التعليمة البرمجية صيانة العلاقة إلى جانب واحد   من العلاقة، وفقط استخدام واضع من جانب واحد (مثل   جعل الجانب الآخر المحمية)، أو إضافته إلى كلا الجانبين، وضمان   يمكنك تجنب حلقة لا نهائية.

المصدر: OneToMany # Getters_and_Setters

هل حاولت إضافة المعلمة mappedBy على حقل في الصف B مثل ذلك

@Entity
class B {
   @ManyToMany(cascade=CascadeType.ALL, mappedBy = "b")
   private List<A> a;
 ..
}

وربما يكون هناك خطأ صغير في الإجابة A_M ل. في رأيي يجب أن يكون:

   @Entity
   class B { 
   @ManyToMany 
   @JoinTable (
       name="A_B",
       joinColumns = {@JoinColumn(name="B_ID")},
       inverseJoinColumns = {@JoinColumn(name="A_ID")}
   )
   private List a; 
   .. 
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top