簡體   English   中英

Hibernate 生成額外的表

[英]Hibernate generates extra table

我有一個這樣的實體

@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實體是這樣的

@Entity
public 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;
    }

}

我想要做的是,創建一個名為past_price的表,它與Price實體具有OneToMany關系。 我有休眠屬性spring.jpa.hibernate.ddl-auto=update所以每當我運行它時都會創建 3 個表1. past_price 2. past_price_prices3. price 但我只是想創建 2 個表past_priceprice 任何幫助,將不勝感激。 謝謝

使用 @JoinColumn 告訴 hibernate 在價格表中創建一列並將其用於加入。 將您的代碼更改為以下內容:

@OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
@JoinColumn(name = "fk_past_price")
private Set<Price> prices = null;

這將在價格表中創建一個名為 fk_past_price 的列,並且不會創建第三個表。

PS:如果沒有充分的理由使用單向,請改用雙向關聯。 像下面這樣:

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

}

事實上,問題是您沒有為實體提供其他映射。 如何將休眠確定Price有關PastPrice Hibernate 不能(但我不確定)在Price存儲相關 id 的數組。

默認情況下,如果您只需要 2 個表,則需要在Price添加字段:

@ManyToOne(...)
private PastPrice pastPrice;

在這種情況下,在表 Price hibernate 中生成帶有 'parent' price id 的 colymn。 因此,對於當前的映射,2 個表就足夠了。

它會像這樣工作:

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

javaDoc 中

擁有關系的字段。 除非關系是單向的,否則是必需的。

使用 targetEntity=price.class

 class pastPrice{
         @OneToMany(targetEntity=Price.class,fetch = FetchType.EAGER,cascade = CascadeType.ALL)
         private Set<Price> prices = null;
    }

或使用mappedby=price

class pastPrice{
     @OneToMany(mappedby="Price",fetch = FetchType.EAGER,cascade = CascadeType.ALL)
      private Set<Price> prices = null;
}

   @Entity("Price)
    class Price{
}

您應該添加“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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM