JPA Manytomany القضية المرجعية
سؤال
لدي ثلاثة طاولات. متاح و plantyperef مع جدول جمعية anmaltomany يسمى متوفر plantplantypeassoc. تبدو مخططات أسفل هذا مثل هذا
CREATE TABLE [dbo].[AvailableOptions](
[SourceApplication] [char](8) NOT NULL,
[OptionId] [int] IDENTITY(1,1) NOT NULL,
...
)
CREATE TABLE [dbo].[AvailOptionPlanTypeAssoc](
[SourceApplication] [char](8) NOT NULL,
[OptionId] [int] NOT NULL,
[PlanTypeCd] [char](2) NOT NULL,
)
CREATE TABLE [dbo].[PlanTypeRef](
[PlanTypeCd] [char](2) NOT NULL,
[PlanTypeDesc] [varchar](32) NOT NULL,
)
ورمز جافا يبدو هكذا.
//AvailableOption.java
@ManyToMany(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
@JoinTable(
name = "AvailOptionPlanTypeAssoc",
joinColumns = { @JoinColumn(name = "OptionId"),
@JoinColumn(name="SourceApplication")},
inverseJoinColumns=@JoinColumn(name="PlanTypeCd"))
List<PlanType> planTypes = new ArrayList<PlanType>();
//PlanType.java
@ManyToMany
@JoinTable(
name = "AvailOptionPlanTypeAssoc",
joinColumns = { @JoinColumn(name = "PlanTypeCd")},
inverseJoinColumns={@JoinColumn(name="OptionId"),
@JoinColumn(name="SourceApplication")})
List<AvailableOption> options = new ArrayList<AvailableOption>();
تنشأ المشكلة عند إجراء اختيار على متاح ، فإنه ينضم إلى نفسه. لاحظ رمز SQL التالي من Backtrace. يجب أن تكون الوصلة الداخلية الثانية على Plantyperef.
SELECT t0.OptionId,
t0.SourceApplication,
t2.PlanTypeCd,
t2.EffectiveDate,
t2.PlanTypeDesc,
t2.SysLstTrxDtm,
t2.SysLstUpdtUserId,
t2.TermDate
FROM dbo.AvailableOptions t0
INNER JOIN dbo.AvailOptionPlanTypeAssoc t1
ON t0.OptionId = t1.OptionId AND t0.SourceApplication = t1.SourceApplication
INNER JOIN dbo.AvailableOptions t2
ON t1.PlanTypeCd = t2.PlanTypeCd
WHERE (t0.SourceApplication = ? AND t0.OptionType = ?)
ORDER BY t0.OptionId ASC, t0.SourceApplication ASC
[params=(String) testApp, (String) junit0]}
المحلول
أنت تخطط لجمعية ثنائية الاتجاه. هذا يعني أنه يجب عليك اختيار جانب واحد كمالك للجمعية. سيكون هذا الجانب مسؤولاً عن تحديث العلاقة في قاعدة البيانات.
إذا اخترت متاحًا كمالك للعلاقة وتريد نموذجًا جديدًا لذلك ، فيجب عليك إضافة Plantype إلى الخيار. إن إضافة الخيار فقط إلى Plantype لن يكون له أي تأثير.
هنا هو الخرائط:
//AvailableOption.java
@ManyToMany(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
@JoinTable(
name = "AvailOptionPlanTypeAssoc",
joinColumns = { @JoinColumn(name = "OptionId"),
@JoinColumn(name="SourceApplication")},
inverseJoinColumns=@JoinColumn(name="PlanTypeCd"))
List<PlanType> planTypes = new ArrayList<PlanType>();
//PlanType.java
@ManyToMany(
mappedBy = "planTypes"
)
List<AvailableOption> options = new ArrayList<AvailableOption>();
يمكنك أيضًا الرجوع إلى توثيق توثيق التعليقات التوضيحية لـ Hibernate الفصل 2.2.5
تحياتي ديفيد
لا تنتمي إلى StackOverflow