【问题标题】:Not Mapped to a Single Property Exception in JPA Mapping未映射到 JPA 映射中的单个属性异常
【发布时间】:2015-06-11 18:00:46
【问题描述】:

我有两个名为 Style 和 StyleExp 的模型及其各自的 PK 类,并且我正在使用 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;
}

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 类中获取 StyleExp 列表为

Style style = styleDao.getStyle(pid, Sname, Scrn)
List<StyleExp> styleExpList =  style.getStyleExp();

它会抛出以下错误

causedBy : org.hibernate.AnnotationException: referencedColumnName(styleId) of StyleExp.style 引用 model.Style 未映射到单个属性

所以请让我知道我在做什么错误?对我来说还有一个疑问是非主键和主键 OneToMany 和 ManyToOne 映射在 JPa 中是可能的吗? 由于非主键映射到主键是上述情况的问题吗?

请帮助我。 提前致谢。

【问题讨论】:

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

标签: java jpa


【解决方案1】:

我已经通过以下方式尝试了 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;
}

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

【讨论】:

    【解决方案2】:

    你应该只在你的父类Style中使用@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;
    

    referencedColumnName”用于映射到父表中的非主列。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 2012-09-12
      • 2017-08-29
      • 2014-02-27
      • 1970-01-01
      相关资源
      最近更新 更多