为了账号安全,请及时绑定邮箱和手机立即绑定

休眠生成额外的表

休眠生成额外的表

婷婷同学_ 2022-08-03 10:28:08
我有一个这样的实体@Entity@Table(name = "past_price")public class PastPrice {    @Id    private String symbol;    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)    private Set<Price> prices = null;    public String getSymbol() {        return symbol;    }    public void setSymbol(String symbol) {        this.symbol = symbol;    }    public Set<Price> getPrices() {        return prices;    }    public void setPrices(Set<Price> prices) {        this.prices = prices;    }}实体是这样的Price@Entitypublic class Price {    @Id    @Temporal(TemporalType.TIMESTAMP)    private Date date;    private String price;    public Date getDate() {        return date;    }    public void setDate(Date date) {        this.date = date;    }    public String getPrice() {        return price;    }    public void setPrice(String price) {        this.price = price;    }}我试图做的是,创建一个带有名称的表,它与实体有关系。我有休眠属性,所以每当我运行这个时,都会创建3个表和.但我只是试图创建2个表和.任何帮助将不胜感激。谢谢past_priceOneToManyPricespring.jpa.hibernate.ddl-auto=update1. past_price2. past_price_prices3. pricepast_priceprice
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

使用@JoinColumn告诉休眠在价格表中创建列,并将其用于联接。将您的代码更改为以下内容:


@OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)

@JoinColumn(name = "fk_past_price")

private Set<Price> prices = null;

这将在价格表中创建一个名为 fk_past_price 的列,并且不会创建第三个表。


P.S.:如果没有充分的理由使用单向关联,请使用双向关联。如下图所示:


@Entity

@Table(name = "past_price")

public class PastPrice {


    @Id

    private String symbol;

    @OneToMany(mappedBy = "pastPrice", cascade = CascadeType.ALL, fetch = FetchType.EAGER)

    private Set<Price> prices = null;


    public String getSymbol() {

        return symbol;

    }


    public void setSymbol(String symbol) {

        this.symbol = symbol;

    }


    public Set<Price> getPrices() {

        return prices;

    }


    public void setPrices(Set<Price> prices) {

        this.prices = prices;

    }


}

价格:


@Entity

public class Price {

    @Id

    @Temporal(TemporalType.TIMESTAMP)

    private Date date;

    private String price;


    @ManyToOne

    @JoinColumn(name = "past_price_symbol", nullable = false)

    private PastPrice pastPrice;


    public PastPrice getPastPrice() {

      return pastPrice;

    }


    public void setPastPrice(PastPrice pastPrice) {

      this.pastPrice = pastPrice;

    }


    public Date getDate() {

        return date;

    }


    public void setDate(Date date) {

        this.date = date;

    }


    public String getPrice() {

        return price;

    }


    public void setPrice(String price) {

        this.price = price;

    }


}


查看完整回答
反对 回复 2022-08-03
?
倚天杖

TA贡献1828条经验 获得超3个赞

您应该添加“mappedBy”来声明哪个字段是相关表。


还在价格实体中添加 ManyToOne。


价格实体 :


@ManyToOne(fetch = FetchType.EAGER)

@JoinColumn("past_price_fk")

private PastPrice pastPrice;

往年价格实体 :


@OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL, mappedBy = "pastPrice")

private Set<Price> prices = null;


查看完整回答
反对 回复 2022-08-03
?
偶然的你

TA贡献1841条经验 获得超3个赞

实际上,问题是您没有为实体提供其他映射。休眠如何识别与 ?休眠无法(但我不确定)在 中存储相关ID的数组。PricePastPricePrice


默认情况下,如果您只需要2个表,则需要在中添加字段:Price


@ManyToOne(...)

private PastPrice pastPrice;

在本例中,在“价格休眠”表中,生成 id 为“父”价格的 colymn。因此,对于当前映射,2个表就足够了。


这将是这样的工作:


select * from Price p join PastPrice pp on pp.id = p.past_price


查看完整回答
反对 回复 2022-08-03
  • 3 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信