背景情境
在讨论这个问题之前,我首先要注意的是,我只需要使用JPA来读取我的模式 - 此应用程序不会在数据库中影响/更改数据,如初。
多对多人加入问题
我的架构中有一个名为ParamInParamClass
的多对多连接表,其中包含其他非关键数据。但是在JPA中,我们通常使用连接表多对多语法将ParamClass
表连接到Param
以获取Param
对象的列表ParamClass
1}}。
所以,如果我使用这种连接语法:
@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
。
我如何解决这种情况?
答案 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属性。