Hibernate 简单使用(四)一对多关联映射

上一篇我说了一下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来维护。


好了,那一对多关系映射就写完了


下一篇就说一下多对多关系映射~


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值