hibernate注释中的映射错误

时间:2012-02-06 07:58:40

标签: java hibernate annotations

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

Principaly hibernate试图映射错误的列。

Param.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; 
}

Trendvalue.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;
}

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

2 个答案:

答案 0 :(得分:1)

The documentation说:

  

您可以使用@ForeignKey覆盖约束名称。注意   这个注释必须放在拥有的一面   relationship,inverseName引用另一边约束。

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

答案 1 :(得分:0)

这不是它应该工作的方式,但是它起作用了:我手动添加了连接表,两个外键也是,但是,如图所示,我也保留了键的确切顺序!这不是主表TrendValues中显示的顺序,但似乎是一些随机顺序... enter image description here

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

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