1. 关系数据库中的实体设计三种关系:
复习:
1. E-R图绘制:实体/类型/属性/方法
2. 实体之间的三种关系:一对一/一对多/多对多
3. 不同实体关系之间如何建表?
4. 一对一: 在任意的一方引入对方主键作为外键(开发中很少使用)
5. 一对多: 在多的一方添加一的一方的主键作为外键
如:customer(顾客编号,姓名…) 一的一方
order(订单编号,顾客编号…)多的一方
6.多对多:产生中间关系表,引入两个实体主键作为外键,两个主键联合成为联合主键
student(学号,姓名…)
course(课程号,课程名称…)
s_c(学号,课程号,分数…)------中间表
7.总结:一对一:外键可以在任意一方
一对多:外键在多的一方
多对多:会生成中间表
2.一对多实践代码
创建Customer.java
package onetomany;
import java.util.HashSet;
import java.util.Set;
public class Customer {
private Integer id;
private String name;
//用户有多个订单
private Set<Order> orders= new HashSet<Order>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
}
创建Order.java
package onetomany;
public class Order {
private Integer id ;
private String address;//订单的收货地址
private Double price;//订单价格
//订单属于某一个客户
private Customer customer;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}
创建顾客的配置文件:Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name代表的是实体类名 table代表的是数据库表名-->
<class name="onetomany.Customer" table="t_customer" catalog="hibernate">
<!-- 主键 name代表的是Student类中的属性 column代表的是数据库表中的字段 -->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!-- 其他属性使用property标签来映射 -->
<property name="name" column="name" type="string" />
<!-- 映射集合属性 -->
<set name="orders" >
<key column="cid"></key>
<one-to-many class="onetomany.Order"/>
</set>
</class>
</hibernate-mapping>
创建订单的配置文件:Order.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name代表的是实体类名 table代表的是数据库表名-->
<class name="onetomany.Order" table="t_order" catalog="hibernate">
<!-- 主键 name代表的是Student类中的属性 column代表的是数据库表中的字段 -->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!-- 普通属性使用property标签来映射 -->
<property name="address" />
<property name="price" />
<!-- 多对一关系映射 cid代表多是数据库生成多外键的名称-->
<many-to-one name="customer" class="onetomany.Customer" column="cid" />
</class>
</hibernate-mapping>
在hibernate核心配置hibernate.cfg.xml里面加入如下配置:
<mapping resource="onetomany/Customer.hbm.xml"/>
<mapping resource="onetomany/Order.hbm.xml"/>
编写测试代码:
@Test
public void test1() {
Session session = HibernateUtil.getSession();
session.beginTransaction();
// 1.创建customer对象
Customer c = new Customer();
c.setName("李本涛");
// 2.创建order对象
Order o1 = new Order();
Order o2 = new Order();
o1.setAddress("丽江");
o1.setPrice(100d);
o2.setAddress("曲靖");
o2.setPrice(50d);
// 3.关联关系---订单属于某一个顾客
o1.setCustomer(c);
o2.setCustomer(c);
// 4. 一个顾客有多个订单
c.getOrders().add(o1);
c.getOrders().add(o2);
// 5.保存
session.save(c);
session.save(o1);
session.save(o2);
session.getTransaction().commit();
session.close();
}