java - hibernate注释中的错误映射

标签 java hibernate annotations

当尝试通过 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 nichtenselben Datentyp wie die verweisende 'PARAM_TRENDVALUE.PcID'-Spalte im 'FK_TrendValue'-Fremdschlüssel。

主要是 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; 
}

趋势值.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”中准确定义表和数据类型,... 不知道还有什么问题。

最佳答案

The documentation说:

You can override the constraint name by use @ForeignKey. Note that this annotation has to be placed on the owning side of the relationship, inverseName referencing to the other side constraint.

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

关于java - hibernate注释中的错误映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9157132/

相关文章:

Java hibernate 找不到 boolean 值的 validator

Spring Security 方法级别安全注释不起作用

java - 我如何使用 s :property in JavaScript function

hibernate - 回滚是否终止 session ?

java - 在 Java 中,this.method() 和 method() 有什么区别?

java - 正确设计多对多关系

java - Spring boot 中的枚举绑定(bind)异常处理

java - 如何动态填充注释

java - 找不到 Spring MVC Controller

java - 如何重复读取 HttpURLConnection?