我是hibernate的新手,需要使用一對多和多對一的關係。這是我的對象中的雙向關係,所以我可以從任一方向進行遍歷。 mappedBy
是推薦的方式,但是,我無法理解它。有人請向我解釋:有人可以請解釋映射在休眠?
- 什麼是使用它的推薦方式?
- 它解決了什麼目的?
在我的例子起見,這裏有我的課與註釋:
Airline
擁有許多AirlineFlights
- 許多
AirlineFlights
屬於ONEAirline
航空公司:
@Entity
@Table(name="Airline")
public class Airline {
private Integer idAirline;
private String name;
private String code;
private String aliasName;
private Set<AirlineFlight> airlineFlights = new HashSet<AirlineFlight>(0);
public Airline(){}
public Airline(String name, String code, String aliasName, Set<AirlineFlight> flights) {
setName(name);
setCode(code);
setAliasName(aliasName);
setAirlineFlights(flights);
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="IDAIRLINE", nullable=false)
public Integer getIdAirline() {
return idAirline;
}
private void setIdAirline(Integer idAirline) {
this.idAirline = idAirline;
}
@Column(name="NAME", nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = DAOUtil.convertToDBString(name);
}
@Column(name="CODE", nullable=false, length=3)
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = DAOUtil.convertToDBString(code);
}
@Column(name="ALIAS", nullable=true)
public String getAliasName() {
return aliasName;
}
public void setAliasName(String aliasName) {
if(aliasName != null)
this.aliasName = DAOUtil.convertToDBString(aliasName);
}
@OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL})
@JoinColumn(name="IDAIRLINE")
public Set<AirlineFlight> getAirlineFlights() {
return airlineFlights;
}
public void setAirlineFlights(Set<AirlineFlight> flights) {
this.airlineFlights = flights;
}
}
AirlineFlights:
@Entity
@Table(name="AirlineFlight")
public class AirlineFlight {
private Integer idAirlineFlight;
private Airline airline;
private String flightNumber;
public AirlineFlight(){}
public AirlineFlight(Airline airline, String flightNumber) {
setAirline(airline);
setFlightNumber(flightNumber);
}
@Id
@GeneratedValue(generator="identity")
@GenericGenerator(name="identity", strategy="identity")
@Column(name="IDAIRLINEFLIGHT", nullable=false)
public Integer getIdAirlineFlight() {
return idAirlineFlight;
}
private void setIdAirlineFlight(Integer idAirlineFlight) {
this.idAirlineFlight = idAirlineFlight;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="IDAIRLINE", nullable=false)
public Airline getAirline() {
return airline;
}
public void setAirline(Airline airline) {
this.airline = airline;
}
@Column(name="FLIGHTNUMBER", nullable=false)
public String getFlightNumber() {
return flightNumber;
}
public void setFlightNumber(String flightNumber) {
this.flightNumber = DAOUtil.convertToDBString(flightNumber);
}
}
編輯:
數據庫模式:
AirlineFlights有idAirline爲ForeignKey的和航空公司沒有idAirlineFlights。這使得AirlineFlights成爲所有者/識別實體?
從理論上講,我希望航空公司是航空公司的所有者。
最後,我對你的描述有點困惑,因爲這裏描述的是mappedBy。它在db中如何組織事件有關係嗎? @DB:AirlineFlights將idAirline作爲外鍵。航空公司只有idAirline作爲主鑰匙,並且不支持有關AirlineFlights @ DB的信息。 – brainydexter 2012-02-02 07:43:07
是的,這很重要。 mappedBy中的名字告訴Hibernate在哪裏找到JoinColumn的配置。 (在AirlineFlight的getAirline()方法上。)您將FlightColumn映射到航空公司的方式,您告訴Airline它*負責維護另一個表中的值。有可能告訴實體它在不同的表中擁有一列,並負責更新它。這不是您通常想要執行的操作,並且可能會導致執行SQL語句的順序問題。 – Affe 2012-02-02 07:51:11
請參閱編輯。在數據庫級別,airlineFlight表擁有idAirline作爲外鍵列。因此,JoinColumn應放在相應的ManytoOne中的airlineFlight類/表上,因爲它擁有該列? – brainydexter 2012-02-02 09:43:58