【问题标题】:Wrong mapping in hibernate annotations休眠注释中的错误映射
【发布时间】:2012-02-27 18:03:01
【问题描述】:

我在尝试通过 manytomany 连接两个表时收到此错误: 错误 [org.hibernate.tool.hbm2ddl.SchemaUpdate] 不成功:更改表 PARAM_TRENDVALUE 添加约束 FK_TrendValue 外键(AreaID、PcID、DeviceID、ValueID)引用 usrIFDBMaster.tblTrdProcessValues 08:44:43,800 错误 [org.hibernate.tool.hbm2ddl.SchemaUpdate] Die 'usrIFDBMaster.tblTrdProcessValues.DeviceID'-Spalte hat nicht denselben Datentyp wie die verweisende 'PARAM_TRENDVALUE.PcID'-Spalte im 'FK_TrendValue'-Fremdschlüssel。

Principaly hibernate 正在尝试映射错误的列。

参数.java:

这是关键:

@EmbeddedId
@AttributeOverrides( {
        @AttributeOverride(name = "pcId", column = @Column(name = "PcID", nullable = false)),
        @AttributeOverride(name = "unitId", column = @Column(name = "UnitID", nullable = false)),
        @AttributeOverride(name = "paramId", column = @Column(name = "ParamID", nullable = false)) })
public ParamId getId() {
    return this.id;
}

这是映射:

/**
 * @return the connection
 */
@ManyToMany
@ForeignKey(name = "FK_Param")
@JoinTable(
        name="PARAM_TRENDVALUE",
        inverseJoinColumns={    
                @JoinColumn(name = "PcID", referencedColumnName = "PcID"),
                @JoinColumn(name = "AreaID", referencedColumnName = "AreaID"),
                @JoinColumn(name = "DeviceID", referencedColumnName = "DeviceID"),
                @JoinColumn(name = "ValueID", referencedColumnName = "ValueID")
        }
)
public List<TrendValue> getTrendValues() {
    return trendValues; 
}

趋势值.java:

这是关键:

@EmbeddedId
@AttributeOverrides( {
        @AttributeOverride(name = "pcId", column = @Column(name = "PcID", nullable = false)),   
        @AttributeOverride(name = "areaId", column = @Column(name = "AreaID", nullable = false)),
        @AttributeOverride(name = "deviceId", column = @Column(name = "DeviceID", nullable = false)),
        @AttributeOverride(name = "valueId", column = @Column(name = "ValueID", nullable = false))
         })
public TrendValueId getId() {
    return this.id;
}

这是映射:

/**
 * @return the params
 */
@ManyToMany(
        mappedBy="trendValues",
        targetEntity=Param.class
    )
@ForeignKey(name = "FK_TrendValue")
public List<Param> getParams() {
    return params;
}

这是我尝试使用的第一个 manytomany,它应该可以工作,我已经尝试过不使用 inversejoincolumns,使用 joincolumns,准确定义“joincolumns/inversejoincolumns”中的表和数据类型,... 不知道还有什么问题。

【问题讨论】:

    标签: java hibernate annotations


    【解决方案1】:

    这不是它应该工作的方式,但它确实有效:我手动添加了连接表,两个外键也是,但是,如图所示,我也必须保持键的确切顺序!这不是主表 TrendValues 中显示的顺序,但它似乎是一些随机顺序...

    如果有人知道为什么这个顺序必须这样,以及我如何更改休眠注释,以便它采用相同的顺序,我将非常感激。

    另外,我现在可以使用我的注释启动程序,但表格不再更改。

    【讨论】:

      【解决方案2】:

      The documentation 说:

      您可以使用@ForeignKey 覆盖约束名称。注意 此注释必须放在 关系,inverseName 引用对方约束。

      @Entity
      public class Woman {
          ...
          @ManyToMany(cascade = {CascadeType.ALL})
          @ForeignKey(name = "TO_WOMAN_FK", inverseName = "TO_MAN_FK")
          public Set<Man> getMens() {
              return mens;
          }
      }
      

      【讨论】:

      • 谢谢你的回答,试过了,但没有改变我的问题,同样的错误。我查找了hibernate尝试做的数据库连接,他尝试将AreaID映射为AreaID =>正确,DeviceID映射为PcID =>不正确,ValueID映射为DeviceID =>不正确,PcID映射为ValueID =>不正确
      • 性别歧视评论:我很高兴这是多对多而不是单对多 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多