2012-02-06 234 views
0

我试图通过manytomany连接两个表时出现此错误: ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] Unsuccessful:alter table PARAM_TRENDVALUE add constraint FK_TrendValue foreign key(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。hibernate注解错误映射

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

It's第一多对多我尝试使用,它应该工作,我已经尝试过没有inversejoincolumns,与joincolumns,正是在定义“joincolumns表和数据类型/ inversejoincolumns“,... 不知道还有什么可能是问题。

回答

0

这不是它应该工作的方式,但它的工作:我手动添加连接表,无论是外键太多,但,如图片所示我太保持严格按照此顺序按键!这不是在主表TrendValues中显示的顺序,但它似乎是一些随机顺序... enter image description here

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

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

1

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; 
    } 
} 
+0

谢谢你的回答,试过了,但没有改变我的问题,同样的错误。我查了一下hibernate试图做的数据库连接,他试图将AreaID与AreaID =>正确,DeviceID与PcID =>不正确,ValueID与DeviceID =>不正确,PcID与ValueID =>不正确 – Charles 2012-02-06 08:16:16

+0

性别歧视评论:I很高兴这是一个ManyToMany而不是OneToMany :-) – 2014-10-08 12:17:02