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,简要说明如下:
双向关联即在表示主表的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;
}
一对多的关系,举个例子:一个订单(order)可以包括多个订单项(orderItem),但同时一个订单项有且仅有一个与之对应的订单,这样订单和订单项就构成了一对多的关系。
many端PO仅需配置字段映射关系,而不需要配置关联关系;
one端配置关联关系如下:
private Set orderItems;//关联关系属性
public void setOrderItems(Set 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 getOrderItems() {
return orderItems;
}
如此即可在one端PO中获取到many端的PO实例了。
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;
}
}
one端和many端都得配置关联关系
one端:
private Set orderItems;//关联关系字段
public void setOrderItems(Set orderItems) {
this.orderItems = orderItems;
}
@OneToMany(fetch=FetchType.EAGER,mappedBy="order")//还记得前面说过的双向关联需要配置mappedBy吗?
public Set 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;
}