我有两个名为Style和StyleExp的模型及其各自的PK类,并使用 JPA 进行映射。
Style类包含四个变量,即pid,Sname,Screen,StyleId。 StyleExp类具有名为StyleId,EId,sno,exp的varibales。
在Style pid类中,Sname,Scrn 是主键,在类StyleExp StyleId中,EId 是主键。这两个类之间有一对多关系。
我在样式类
中提供了如下所示的映射@Entity(name="Style")
@Table(name="Style")
@IdClass(StylePk.class)
public class Style implements Serializable{
@Id
private String pid;
@Id
private String Sname;
private String styleId;
.....
@OneToMany(fetch=FetchType.Lazy, mappedBy="style")
protected List<StyleExp> styleExp;
}
In the class STyleExp I have provided the Mapping as follows,
@Entity(name="StyleExp")
@Table(name="StyleExp")
public class StyleExp implements Serializable{
@Id
private String styleId;
@Id
private String eId;
@ManyToOne(fetch=FetchType.Lazy)
@JoinColumns({
@JoinColumn(name="styleId",
referencedColumnName="styleId",insertable=false,updatable=false)
})
protected Style style;
}
但是当我运行这些代码时,将Style的Style列表从Style类中取出为
Style style = styleDao.getStyle(pid, Sname, Scrn)
List<StyleExp> styleExpList = style.getStyleExp();
它会抛出以下错误
causedBy:org.hibernate.AnnotationException:StyleExp.style的referencedColumnName(styleId)引用model.Style未映射到单个属性
所以请让我知道我在做什么错误?对我来说还有一个疑问是非主键和主键OneToMany和ManyToOne映射在JPa中是可能的吗? 由于映射到主键的非主键是上述情况中的问题吗?
请帮助我。 在此先感谢。
答案 0 :(得分:0)
我已尝试过以下针对Style和StyleExp之间的OneToMany映射
@Entity(name="Style")
@Table(name="Style")
public class Style implements Serializable{
private String pid;
private String Sname;
@Id
private String styleId;
.....
@OneToMany(fetch=FetchType.Lazy, cascade=CascadeType.ALL)
@JoinColumns({
@JoinColumn(name="styleId", referencedColumnName="styleId" insertable=false, updatable=false)
})
protected List<StyleExp> styleExp;
}
In the class StyleExp I have provided the Mapping as follows,
@Entity(name="StyleExp")
@Table(name="StyleExp")
public class StyleExp implements Serializable{
@Id
private String styleId;
@Id
private String eId;
}
通过使用上面的代码,我可以映射上面的两个表
答案 1 :(得分:0)
您只应在父类样式中使用@Id作为主键。 您希望将其设置为唯一的其他列,然后执行以下操作:
// primary key
@Id
@Column(name = "pid", unique = true, nullable = false)
private String pid;
// unique key
@Column(name = "styleId", unique = true, nullable = false)
private String styleId;
然后在 StyleExp 类中,您可以映射到Style类中的唯一列 styleId ,如下所示
// you are referencing to unique column in parent table
@ManyToOne
@JoinColumn(name = "styleId", nullable = false, referencedColumnName = "styleId")
protected Style style;
&#34; referencedColumnName &#34;当您要映射到父表中的无主列时使用。
无论如何,不需要在表/模型类中使用多个@Id。