3 回答
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;
}
}
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;
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
添加回答
举报