Hibernate进阶之单向一对多关系映射

上一篇介绍了Hibernate进阶之单向多对一关系映射,接下来用实例介绍单向一对多关系映射。

依然使用上一篇创建的表。

接下来写映射文件CustomerOrder.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="example.one2many_single">
	<class name="Customer" table="customers">
		<id name="id" column="id" type="int">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		<property name="age" column="age" type="int"></property>
		<!-- set标签用于映射单向一对多
			name表示单方的关联属性
			table表示多方对应表的名字
			key-cloumn表示多方对应表的外键
			one-to-many-class表示单方关联属性中的每个元素的类型
		 -->
		 <set name="orderSet" table="orders" cascade="all">
		 	<key column="customers_id"></key>
		 	<one-to-many class="Order"/>
		 </set>
	</class>
	<!-- 映射类的多方 -->
	<class name="Order" table="Orders">
		<id name="id" column="id">
			<generator class="native"></generator>
		</id>
		<property name="orderNo" column="orderNo"></property>
		<property name="price" column="price"></property>
	</class>
</hibernate-mapping>

实体类:Customer,Order

Customer类:

package example.one2many_single;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * 客户(一方)
 * @author Administrator
 *
 */
public class Customer {

	private Integer id;//对应表的主键
	private String name;
	private Integer age;
	private Set<Order> orderSet=new LinkedHashSet<Order>();//关联属性
	public Customer() {
	}
	public Customer(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}
	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 Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Set<Order> getOrderSet() {
		return orderSet;
	}
	public void setOrderSet(Set<Order> orderSet) {
		this.orderSet = orderSet;
	}
	
}

Order类:

package example.one2many_single;
/**
 * 订单(多的一方)
 * @author Administrator
 *
 */
public class Order {

	private Integer id;
	private String OrderNo;//订单编号
	private Integer price;//价格
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getOrderNo() {
		return OrderNo;
	}
	public void setOrderNo(String orderNo) {
		OrderNo = orderNo;
	}
	public Integer getPrice() {
		return price;
	}
	public void setPrice(Integer price) {
		this.price = price;
	}
	public Order(String orderNo, Integer price) {
		super();
		OrderNo = orderNo;
		this.price = price;
	}
	public Order() {
	}
	
}
接下来写测试类 CustomerOrderDao进行测试:

package example.one2many_single;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import example.utils.HibernateUtils;

public class CustomerOrderDao {

	/**
	 * 只保存客户,级联保存订单
	 */
	@Test
	public void test01(){
		//创建客户
		Customer customer=new Customer("小梅",18);
		//创建订单
		Order o1=new Order("30001",200);
		Order o2=new Order("30002",300);
		//创建单向关联
		customer.getOrderSet().add(o1);
		customer.getOrderSet().add(o2);
		Session session=HibernateUtils.getSession();;
		Transaction t=session.getTransaction();
		try{
			t.begin();
			session.save(customer);
			t.commit();
		}catch (Exception e) {
			e.printStackTrace();
			t.rollback();
			// TODO: handle exception
		}finally{
			HibernateUtils.closeSession();
		}
	}
	/**
	 * 只更新客户,级联更新订单
	 */
	@Test
	public void test2(){
		Session session=HibernateUtils.getSession();
		Transaction t=session.getTransaction();
		try{
			t.begin();
			Customer c=(Customer) session.get(Customer.class, 7);
			c.setName("啊哈哈哈");
			for(Order o:c.getOrderSet()){
				o.setPrice(o.getPrice()+30);
			}
			session.update(c);
			t.commit();
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			
		}
	}
	@Test
	public void test3(){//只删除客户,级联删除订单
		Session session = HibernateUtils.getSession();
		Transaction t = session.getTransaction();
		try{
			t.begin();
			
			Customer c = (Customer) session.get(Customer.class,9);
			
			session.delete(c);
			
			t.commit();
		}catch(Exception e){
			e.printStackTrace();
			t.rollback();
		}finally{
			HibernateUtils.closeSession();
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值