JPA ManyToMany Referenzierung Ausgabe
Frage
Ich habe drei Tabellen. AvailableOptions und PlanTypeRef mit einem ManyToMany Zuordnungstabelle genannt AvailOptionPlanTypeAssoc. Die abgespeckte Schemata wie folgt aussehen
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,
)
Und die Java-Code sieht wie folgt aus.
//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>();
Das Problem entsteht, wenn ein Auswahl auf AvailableOptions macht es zurück auf sich selbst verbindet. Beachten Sie die folgende SQL-Code aus dem Backtrace. Die zweite innere Verknüpfung sollte auf PlanTypeRef sein.
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]}
Lösung
Sie zuordnen eine bidirektionale Assoziation. Das heißt, müssen Sie eine Seite als Eigentümer des Vereins wählen. Diese Seite wird zur Aktualisierung der Beziehung in der Datenbank verantwortlich.
Wenn Sie AvailableOption als Eigentümer der Beziehung wählen, und Sie wollen ein neues PlanType dafür, müssen Sie die plantype der Option hinzufügen. die Möglichkeit, sich nur auf die plantype Hinzufügen keine Wirkung haben.
Hier ist das Mapping:
//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>();
Sie können auch auf die Hibernate Annotations Dokumentation Kapitel 2.2.5
Viele Grüße David