【问题标题】:Can someone please explain "Repeated column in mapping for entity"?有人可以解释“实体映射中的重复列”吗?
【发布时间】:2021-01-01 18:30:02
【问题描述】:

我不断收到错误:

org.hibernate.MappingException:实体映射中的重复列: net.tekknow.moneymachine.model.Quote 列:日期(应映射 用 insert="false" update="false")"

无论我尝试什么。

这是我的 Quote 课程:

public class Quote {
    @EmbeddedId
    private QuoteId quoteId;    //composite id needed by hibernate
    
    private String symbol;
    private Date date;
    private float close;
 
    public Quote() {}
    public Quote(String symbol, Date date, float close) {
        this.symbol = symbol;
        this.date = date;
        this.close = close;
    }
    public QuoteId getId() {
        return quoteId;
    }
    public void setId(QuoteId id) {
        this.quoteId = id;
    }

    @Column(name = "symbol", insertable = false, updatable = false, nullable = false)
    public String getSymbol() {
        return symbol;
    }
    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    @Column(name = "date", insertable = false, updatable = false, nullable = false)
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
... //other getters and setters

这里是 QuoteId 类,Hibernate 应该需要它来连接两列作为每个 https://vladmihalcea.com/the-best-way-to-map-a-composite-primary-key-with-jpa-and-hibernate/ 的复合键

@Embeddable
public class QuoteId implements Serializable {
    @Column(name = "symbol", insertable = false, updatable = false)
    private String symbol;
    
    @Column(name = "date", insertable = false, updatable = false)
    private Date date;
    
    public QuoteId(String symbol, Date date) {
        this.symbol = symbol;
        this.date = date;
    }
    public QuoteId() {}
    
    public String getSymbol() {
        return symbol;
    }
    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
    ...    // other getters and setters
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        QuoteId that = (QuoteId) o;
        return Objects.equals(symbol, that.symbol) && Objects.equals(date, that.date);
    }
    @Override
    public int hashCode() {
        return Objects.hash(symbol, date);
    }   
}

希望各位专家能告诉我我做错了什么。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    您的QuoteId 类被标记为@Embeddable,这意味着Quote 的数据库表除了它自己的列之外,还从QuoteId 中提取所有列。

    因为您在两个表中都有一个名称为 date 的列(顺便说一下,还有 symbol),所以您最终会得到一个包含两个同名列的表定义,这是不允许的。

    如果您尝试对Quote 使用复合键,则需要从Quote 中删除datesymbol。请注意,这不是连接两个表,因为不会有 QuoteId 作为单独的表。

    【讨论】:

    • 这完全有道理。非常感谢您帮助我理解!
    猜你喜欢
    • 2017-11-25
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    相关资源
    最近更新 更多