3 回答

TA貢獻2003條經驗 獲得超2個贊
使用 @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;
}
}

TA貢獻1802條經驗 獲得超6個贊
在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{
}

TA貢獻1827條經驗 獲得超4個贊
事實上,問題在于您沒有為實體提供其他映射。hibernate 如何識別Price與 相關的PastPrice?Hibernate 不能(但我不確定)在Price.
默認情況下,如果您只需要 2 個表,則需要在以下位置添加字段Price:
@ManyToOne(...)
private PastPrice pastPrice;
在這種情況下,在表 Price hibernate 中生成 id 為“父”價格的 colymn。因此,對于當前映射 2 個表就足夠了。
這將是這樣的:
select * from Price p join PastPrice pp on pp.id = p.past_price
添加回答
舉報