gpt4 book ai didi

java - JPA ManyToMany 引用问题

转载 作者:行者123 更新时间:2023-12-04 06:54:54 28 4
gpt4 key购买 nike

我有三张 table 。 AvailableOptions 和 PlanTypeRef 与一个名为 AvailOptionPlanTypeAssoc 的多对多关联表。修剪后的架构如下所示

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,
)

Java 代码看起来像这样。
//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>();

当在 AvailableOptions 上进行选择时会出现问题,它会重新连接到自身。请注意回溯中的以下 SQL 代码。第二个内连接应该在 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]}

最佳答案

您正在映射双向关联。这意味着您必须选择一方作为协会的所有者。此方将负责更新数据库中的关系。

如果您选择 AvailableOption 作为关系的所有者,并且您想要一个新的 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 annotation documentation chapter 2.2.5

问候
大卫

关于java - JPA ManyToMany 引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2668449/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com