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

4

我有两个模型,分别名为Style和StyleExp,它们各自有对应的主键类,并且我正在使用JPA进行映射。

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

在Style类中,pid、Sname和Scrn是主键,在StyleExp类中,StyleId和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;
}  

在STyleExp类中,我提供了以下的映射:
@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类中获取StyleExp列表。
Style style = styleDao.getStyle(pid, Sname, Scrn)
List<StyleExp> styleExpList =  style.getStyleExp();

它抛出以下错误

原因:org.hibernate.AnnotationException: StyleExp.style的referencedColumnName(styleId)引用了model.Style中未映射到单个属性的字段

所以请告诉我我犯了什么错误?还有一个问题是,非主键和主键之间的OneToMany和ManyToOne映射在JPA中是否可行? 因为非主键映射到主键是上述情况的问题吗?

请帮助我。 提前致谢。


不要描述你的代码,直接发布它。 - JB Nizet
我已经在我的帖子中添加了代码,请检查一下。 - umamahes
1
你的映射并不是很合理。如果 StyleExp 中的 styleId 能够唯一标识一个 Style,那么它应该成为 Style 的唯一标识符,pid 不应该成为其一部分。我的建议是:避免使用复合键。使用单列、纯技术、自动生成的 ID。 - JB Nizet
感谢您宝贵的评论。我会尝试这种方法。 - umamahes
谢谢Nizet。我已经尝试通过在Style类中使用@Id标记styleId。它起作用了。 - umamahes
2个回答

0
我已经尝试了以下方法来实现Style和StyleExp之间的一对多映射。
@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;
}

在StyleExp类中,我提供了以下的映射:
@Entity(name="StyleExp")
@Table(name="StyleExp")
public class StyleExp implements Serializable{
    @Id
    private String styleId;
    @Id
    private String eId;
}

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

0
你应该只在父类的主键上使用 @Id Style。 如果你想将其他列设置为唯一值,可以按照以下方式进行操作:
  // 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;

当你想要映射到父表中的非主键列时,可以使用"referencedColumnName"。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接