Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未映射到JPA映射中的单个属性异常_Java_Jpa - Fatal编程技术网

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

Java 未映射到JPA映射中的单个属性异常,java,jpa,Java,Jpa,Am有两个名为Style和StyleExp的模型,分别具有各自的PK类,Am使用JPA进行映射 Style类包含四个变量,即pid、Sname、Screen和StyleId。类StyleExp的变量名为StyleId、EId、sno、exp 在类Stylepid中,Sname、Scrn是主键,在类StyleExpStyleId中,EId是主键。我在这两个类之间有一对多的关系 我在Style类中提供了如下映射: @Entity(name="Style") @Table(name="Style")

Am有两个名为Style和StyleExp的模型,分别具有各自的PK类,Am使用JPA进行映射

Style类包含四个变量,即pid、Sname、Screen和StyleId。类StyleExp的变量名为StyleId、EId、sno、exp

在类Stylepid中,Sname、Scrn是主键,在类StyleExpStyleId中,EId是主键。我在这两个类之间有一对多的关系

我在Style类中提供了如下映射:

@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;
}
@实体(name=“Style”)
@表(name=“Style”)
@IdClass(StylePk.class)
公共类样式实现了可序列化{
@身份证
私有字符串pid;
@身份证
私有字符串Sname;
私有字符串styleId;
.....
@OneToMany(fetch=FetchType.Lazy,mappedBy=“style”)
受保护列表styleExp;
}
在类STyleExp中,我提供了如下映射:,
@实体(name=“StyleExp”)
@表(name=“StyleExp”)
公共类StyleExp实现可序列化{
@身份证
私有字符串styleId;
@身份证
私有字符串eId;
@manytone(fetch=FetchType.Lazy)
@连接柱({
@JoinColumn(name=“styleId”,
referencedColumnName=“styleId”,insertable=false,updateable=false)
})
保护风格;
}
但是当我运行这些代码时,从样式类中获取样式表的列表

Style style = styleDao.getStyle(pid, Sname, Scrn)
List<StyleExp> styleExpList =  style.getStyleExp();
Style=styleDao.getStyle(pid、Sname、Scrn)
List styleExpList=style.getStyleExp();
它抛出以下错误

原因:org.hibernate.AnnotationException:StyleExp.style引用模型的referencedColumnName(styleId)。样式未映射到单个属性

所以请告诉我我犯了什么错误?对我来说,还有一个疑问是,在JPa中,非主键和主键一对多映射是可能的吗? 由于非主键映射到主键,上述情况是否存在问题

请帮帮我。
提前感谢。

我已经通过以下方法尝试了样式和样式之间的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;
}
@实体(name=“Style”)
@表(name=“Style”)
公共类样式实现了可序列化{
私有字符串pid;
私有字符串Sname;
@身份证
私有字符串styleId;
.....
@OneToMany(fetch=FetchType.Lazy,cascade=CascadeType.ALL)
@连接柱({
@JoinColumn(name=“styleId”,referencedColumnName=“styleId”insertable=false,updateable=false)
})
受保护列表styleExp;
}
在类StyleExp中,我提供了如下映射:,
@实体(name=“StyleExp”)
@表(name=“StyleExp”)
公共类StyleExp实现可序列化{
@身份证
私有字符串styleId;
@身份证
私有字符串eId;
}

通过使用上述代码,我可以映射上述两个表

您应该只在父类样式中使用@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类中,可以映射到样式类中的唯一列styleId,如下所示

 // you are referencing to unique column in parent table    
    @ManyToOne
    @JoinColumn(name = "styleId", nullable = false, referencedColumnName = "styleId")
        protected Style style;
要映射到父表中的非主列时,将使用“referencedColumnName”


无论如何,不需要在表/模型类中使用多个@Id。

不要描述您的代码。我已经在我的帖子中添加了代码。请检查。您的映射没有多大意义。如果STYLExp中的styleId足以唯一标识样式,那么它应该是样式的唯一标识符,pid不应该是其中的一部分。我的建议是:避免像瘟疫一样使用复合键。使用单列、纯技术、自动生成的ID。感谢您的宝贵意见。我会用这种方法试试的。我已经尝试在Style类中将styleId标记为@Id。它起作用了