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; -
}
本文详细解析了一对一和一对多关系映射的概念及其在数据库设计中的应用。通过具体示例,阐述了单向与双向关联的区别,以及如何在不同场景下正确配置关联关系。
1475

被折叠的 条评论
为什么被折叠?



