上一篇介绍了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();
}
}
}