未映射到JPA映射中的单个属性异常

时间:2015-06-11 18:00:46

标签: java jpa

我有两个名为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中是可能的吗? 由于映射到主键的非主键是上述情况中的问题吗?

请帮助我。 在此先感谢。

2 个答案:

答案 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。