hibernate物件關係對映-註解
1.OneToOne關係對映
OneToOne即一對一對映,簡單來說就是一個主表student和一個從表stucreditcard,B表中存在一個外來鍵關聯到student表,這種關聯關係既可以以外來鍵的方式建立也可以是人工維護的關聯關係。
單向一對一關聯(不包括主鍵關聯)
這種關聯關係只能配置在從表的PO中,簡要示例如下:
-
@Entity
-
@Table(name="stucreditcard")
-
public class StudentCard {
-
private Integer cardId;
-
private Integer balance;
-
private Student student;
-
......
-
@OneToOne
-
@JoinColumn(name="studentid",referencedColumnName="id")//這裡的studentid為從表的外來鍵欄位名,id為從表所引用的主表字段名
-
,預設為主鍵
-
public Student getStudent() {
-
return student;
-
}
-
public void setStudent(Student student) {
-
this.student = student;
-
}
以上配置就可以從StudentCard例項中獲取Student例項。
雙向一對一關聯(不包括主鍵關聯)
雙向關聯的配置涉及OneToOne的一個屬性mappedBy,簡要說明如下:
a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy屬性,ManyToOne不存在該屬性;
b) mappedBy標籤一定是定義在the owned side(被擁有方的,這裡就是主表),他指向the owning side(擁有方,這裡是從表);
c) 關係的擁有方負責關係的維護,在擁有方建立外來鍵。所以用到@JoinColumn
d)mappedBy跟JoinColumn/JoinTable總是處於互斥的一方
e)如果雙向關係不配置mappedBy,則預設關聯主鍵(不配置mappedBy就得配置JoinColumn啦)
雙向關聯即在表示主表的PO中可以獲取從表中關聯的資訊,在從表的PO中也可以獲取主表中從表關聯的資訊,示例如下:
主表配置:
-
@Entity
-
@Table(name="student")
-
public class Student implements Serializable{
-
private static final long serialVersionUID = 1L;
-
private Integer studentId;
-
private String name;
-
private StudentCard sc;
-
@OneToOne(mappedBy="student")//這裡的student是從表的PO中主表PO的屬性名
-
public StudentCard getSc() {
-
return sc;
-
}
-
public void setSc(StudentCard sc) {
-
this.sc = sc;
-
}
從表配置:
-
@OneToOne
-
@JoinColumn(name="studentid",referencedColumnName="id")//studentid是從表中的欄位名,id是主表中的欄位名,這裡id也可以不為主鍵
-
public Student getStudent() {
-
return student;
-
}
-
public void setStudent(Student student) {
-
this.student = student;
-
}
2.OneToMany關係
一對多的關係,舉個例子:一個訂單(order)可以包括多個訂單項(orderItem),但同時一個訂單項有且僅有一個與之對應的訂單,這樣訂單和訂單項就構成了一對多的關係。
在one端配置單向關係
many端PO僅需配置欄位對映關係,而不需要配置關聯關係;
one端配置關聯關係如下:
private Set<OrderItem> orderItems;//關聯關係屬性
-
public void setOrderItems(Set<OrderItem> orderItems) {
-
this.orderItems = orderItems;
-
}
-
@OneToMany(fetch=FetchType.EAGER)
-
/**
-
* 下面的order_id是many方的表字段;
-
* id為one方的表字段(不寫referencedColumnName="XXX"則預設為主鍵,也可以指定不是主鍵的欄位)
-
* order_id和id關聯
-
*/
-
@JoinColumn(name="order_id",referencedColumnName="id")
-
public Set<OrderItem> getOrderItems() {
-
return orderItems;
-
}
如此即可在one端PO中獲取到many端的PO例項了。
在many端配置單向關係
one端PO僅需配置欄位對映關係,而不需要配置關聯關係
many端配置如下:
-
@Entity
-
@Table(name="orderitem")
-
public class OrderItem {
-
private Order order;//關聯關係欄位
-
private Integer id;
-
// private Integer orderId;//與one表的關聯欄位,這裡先註釋掉,可以試下不註釋
-
// @Column(name="order_id")
-
// public Integer getOrderId() {
-
// return orderId;
-
// }
-
// public void setOrderId(Integer orderId) {
-
// this.orderId = orderId;
-
// }
-
@Id
-
@GeneratedValue(strategy=GenerationType.AUTO)
-
public Integer getId() {
-
return id;
-
}
-
public void setId(Integer id) {
-
this.id = id;
-
}
-
@ManyToOne
-
/**
-
* order_id many表的欄位
-
* id為one方的表字段(不寫referencedColumnName="XXX"則預設為主鍵,也可以指定不是主鍵的欄位)
-
* order_id和id關聯
-
*/
-
@JoinColumn(name="order_id",referencedColumnName="id")
-
public Order getOrder() {
-
return order;
-
}
-
public void setOrder(Order order) {
-
this.order = order;
-
}
}
配置OneToMany雙向關係
one端和many端都得配置關聯關係
one端:
private Set<OrderItem> orderItems;//關聯關係欄位
-
public void setOrderItems(Set<OrderItem> orderItems) {
-
this.orderItems = orderItems;
-
}
-
@OneToMany(fetch=FetchType.EAGER,mappedBy="order")//還記得前面說過的雙向關聯需要配置mappedBy嗎?
-
public Set<OrderItem> getOrderItems() {
-
return orderItems;
-
}
many端:
-
private Order order;//關聯關係欄位
-
@ManyToOne
-
/**
-
* order_id many表的欄位
-
* id為one方的表字段(不寫referencedColumnName="XXX"則預設為主鍵,也可以指定不是主鍵的欄位)
-
* order_id和id關聯
-
*/
-
@JoinColumn(name="order_id",referencedColumnName="id")
-
public Order getOrder() {
-
return order;
-
}
-
public void setOrder(Order order) {
-
this.order = order;
-
}