JPA - 使用包含其他信息的多对多表

时间:2014-03-26 13:26:22

标签: java database jpa

背景情境

在讨论这个问题之前,我首先要注意的是,我只需要使用JPA来读取我的模式 - 此应用程序不会在数据库中影响/更改数据,如初。

多对多人加入问题

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

entity relationship diagram

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

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

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

我如何解决这种情况?

1 个答案:

答案 0 :(得分:2)

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

我正在提供以下答案,因为虽然这使用了链接中的信息,直接来自链接的代码对我来说不适用于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属性。