上一篇我说了一下Hibernate一对一关联映射
这一次就说一下Hibernate一对多关联映射
讲个例子来说一下这个一对多关系吧~让我们更好的理解~
实例:一个顾客对应多个订单
步骤:
1.先把POJO类写出来
Customer类:
public class Customer {
private Long id;
private String name;
private String telephone;
private String address;
//一个顾客对应对个订单,set集合要初始化,要不然会报空指针错误
private Set<Order>set=new HashSet<Order>();
public Customer() {
super();
// TODO Auto-generated constructor stub
}
public Customer(Long id, String name, String telephone, String address) {
super();
this.id = id;
this.name = name;
this.telephone = telephone;
this.address = address;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Set<Order> getSet() {
return set;
}
public void setSet(Set<Order> set) {
this.set = set;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", telephone=" + telephone + ", address=" + address + "]";
}
}
Order类:
//一个顾客有多个订单
public class Order {
private Long id;
private String total;
private Date orderDate;
//一个订单对应一个顾客
private Customer customer;
public Order() {
super();
// TODO Auto-generated constructor stub
}
public Order(Long id, String total, Date orderDate) {
super();
this.id = id;
this.total = total;
this.orderDate = orderDate;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTotal() {
return total;
}
public void setTotal(String total) {
this.total = total;
}
public Date getOrderDate() {
return orderDate;
}
public void setOrderDate(Date orderDate) {
this.orderDate = orderDate;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
@Override
public String toString() {
return "Order [id=" + id + ", total=" + total + ", orderDate=" + orderDate + "]";
}
}
2.编写映射文件来双向维护表的关系~
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 package="com.xu.day5.one2many">
<class name="Customer" table="tb_custome">
<id name="id" column="id">
<generator class="increment" />
</id>
<property name="name" />
<property name="telephone" />
<property name="address" />
<!-- 关联映射 一对多 一个顾客可以有好多订单
cascade="delete"是连级删-->
<!-- lazy="true"是延迟加载 -->
<!-- c_id在这里的意思就是让Customer知道Order的外键是谁-是c_id -->
<set name="set" lazy="true" cascade="delete">
<key column="c_id"/>
<one-to-many class="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 package="com.xu.day5.one2many">
<class name="Order" table="tb_order">
<id name="id" column="id">
<generator class="increment" />
</id>
<property name="total" />
<property name="orderDate" />
<!-- 关联映射 多对一 -->
<!-- c_id在order表中是外键 -->
<many-to-one name="customer" class="Customer"
column="c_id"></many-to-one>
</class>
</hibernate-mapping>
这里我就不解释了,在前几篇(同类文章)都解释的很清楚~
3.把映射文件集成到配置文件hibernate.cfg.xml上:
4.测试类Test:
模拟几个功能~
注册用户功能:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=HibernateSessioFactory.getSession();
Transaction tr=session.beginTransaction();
System.out.println(1111111);
//注册用户,用save
Customer c=new Customer(null, "张三", "1224321212", "山西");
Customer c2=new Customer(null, "李四", "216362732", "江西");
session.save(c);
session.save(c2);
tr.commit();
}
}
效果图如下:
用户登录和下订单功能:
//用户登录,通过id load或get
//sql select 列 from 表名 where 列=值
//hql select 属性 from 表名 where 属性=值
String hql="from Customer where name=?";
Query query=session.createQuery(hql);
query.setString(0, "李四");
Customer customer=(Customer) query.uniqueResult();
System.out.println(customer);
//下订单 创建订单并且让该订单和顾客相关联
Order o1=new Order(null, "100.1", new Date());
Order o2=new Order(null, "345.8", new Date());
//关系的维护:从方对象维护主方对象
o1.setCustomer(customer);
o2.setCustomer(customer);
//保存订单
session.save(o1);
session.save(o2);
就不贴效果图了,图很难贴上来~
顾客查找自己所有的订单功能:
//顾客查找自己所有的订单
String hql="from Customer where name=?";
Query query=session.createQuery(hql);
query.setString(0, "李四");
Customer customer=(Customer) query.uniqueResult();*/
Set<Order>orders=customer.getSet();
for(Order order:orders){
System.out.println(order);
}
删除顾客功能:
session.delete(customer);
注意:
在映射文件中,双方都维护了外键。主方通过<set>集合中的<key>来维护,从方通过
<many-to-one> 中的column来维护。
好了,那一对多关系映射就写完了
下一篇就说一下多对多关系映射~