【问题标题】:JPA - working with many-to-many tables with additional information contained in themJPA - 使用包含附加信息的多对多表
【发布时间】:2023-03-24 02:16:01
【问题描述】:

背景背景

在讨论这个问题之前,我首先要指出的是,我只需要使用 JPA 来读取我的架构 - 此应用程序不会影响/更改数据库中的任何数据。

多对多加入问题

我的架构中有一个名为ParamInParamClass 的多对多连接表,其中包含其他非键数据。但在 JPA 中,我们通常使用 join-table 多对多语法将 ParamClass 表连接到 Param 以获取 ParamParamClass 中的对象列表。

所以,如果我使用这种连接语法:

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
        name="ParamInParamClass",
        joinColumns = {
            @JoinColumn(name = "FKParamClassID", referencedColumnName = "ID")},
        inverseJoinColumns = {
            @JoinColumn(name="FKParamID", referencedColumnName="ID")})
private List<Parameter> params;

ParamClass 中,那么我无法访问ParamInParamClass 中的DefaultOverride | MinimumOverride | MaximumOverride

我该如何解决这种情况?

【问题讨论】:

  • 谢谢,这看起来很有用。在hibernate之上使用JPA可以实现同样的事情吗? (我现在正在研究它,只是并行询问)。
  • 请参阅 EclipseLink 完成的本手册,建议使用 JPA 方法来解决此问题:en.wikibooks.org/wiki/Java_Persistence/…
  • 基本上他们所做的是将多对多关系表示为两个多对一(一对多)关系,并将子父关系的设置委托给第三个实体类(表),可以有任意多的额外列。
  • 知道了,谢谢大家的帮助:)

标签: java database jpa


【解决方案1】:

我根据@perissf 的链接解决了这个问题,还从@hovanessyan 的休眠链接中学到了一些有用的信息。

我在下面提供答案,因为虽然这使用来自链接的信息,但直接来自链接的代码不适用于 JPA/Hibernate - 我必须使用注释部分中提到的额外代码链接代码。因此,在链接顶部阅读此内容有望在一段时间内与其他人相同。


解决方案是将我提供的ParameterClass 代码更改为:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "parameterClass")
private List<ParamInParamClass> parameters;
public List<ParamInParamClass> getParameters() { return parameters; }

然后我必须创建以前不需要的ParamInParamClass 实体,因为通常多对多关系不需要您定义连接表。它需要在这里定义,因为我从中得到了额外的字段。

ParamInParamClass 类中,我必须显式链接实体:

@Id
@Column
private String fkParamClassID;
public String getFKParamClassID(){ return fkParamClassID; }
public void setFKParamClassID (String value) { fkParamClassID = value; }

@Id
@Column
private String fkParamID;
public String getFKParamID(){ return fkParamID; }
public void setFKParamID (String value) { fkParamID = value; }

//---------------------------------------------------------------------------------------------
// Join columns based on key columns.
//---------------------------------------------------------------------------------------------

@ManyToOne
@JoinColumn(name = "fkParamClassID", referencedColumnName = "ID", insertable = false, updatable = false)
private ParameterClass parameterClass;

@ManyToOne
@JoinColumn(name = "fkParamID", referencedColumnName = "ID", insertable = false, updatable = false)
private Parameter parameter;

我还必须确保这个 ParamInParamClass 类使用了 @IdClass,因为它有多个 @Id 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2022-08-18
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多