测试类
package cn.test;
import org.hibernate.Session;
import org.junit.Test;
import cn.domain.Customer;
import cn.domain.Order;
import cn.utils.HibernateUtils;
public class OneToManyTest {
//测试保存
@Test
public void test1() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//创建一个客户
Customer c = new Customer();
c.setName("李四");
//创建两个订单
Order o1 = new Order();
o1.setMoney(9999d);
o1.setReceiverInfo("重庆");
Order o2 = new Order();
o2.setMoney(1032d);
o2.setReceiverInfo("广州");
//订单关联客户
o1.setC(c);
o2.setC(c);
//客户关联订单(Customer中的orders是集合方式,要用add方法)
c.getOrders().add(o1);
c.getOrders().add(o2);
session.save(o1);
session.save(o1);
session.save(c);
session.getTransaction().commit();
session.close();
}
//测试单向关联保存
@Test
public void test2() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//创建一个客户
Customer c = new Customer();
c.setName("王五");
//创建两个订单
Order o1 = new Order();
o1.setMoney(9999d);
o1.setReceiverInfo("厦门");
Order o2 = new Order();
o2.setMoney(1032d);
o2.setReceiverInfo("泉州");
o1.setC(c);
o2.setC(c);
session.save(o1);
session.save(o2);
session.getTransaction().commit();
session.close();
}
//双向关联维护
@Test
public void test3() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//创建一个客户
Customer c = new Customer();
c.setName("武七");
//创建两个订单
Order o1 = new Order();
o1.setMoney(9999d);
o1.setReceiverInfo("漳州");
Order o2 = new Order();
o2.setMoney(1032d);
o2.setReceiverInfo("深圳");
o1.setC(c);
o2.setC(c);
c.getOrders().add(o1);
c.getOrders().add(o2);
session.save(c);
session.getTransaction().commit();
session.close();
}
// 测试一对多对象导航
@Test
public void test4() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//创建一个客户
Customer c = new Customer();
c.setName("朱巴");
//创建两个订单
Order o1 = new Order();
o1.setMoney(9999d);
o1.setReceiverInfo("天津");
Order o2 = new Order();
o2.setMoney(1032d);
o2.setReceiverInfo("深圳");
Order o3 = new Order();
o2.setMoney(1032d);
o2.setReceiverInfo("香港");
o1.setC(c);
c.getOrders().add(o3);
c.getOrders().add(o2);
session.save(o1);
session.getTransaction().commit();
session.close();
}
//级联删除,删除客户顺便删除订单
@Test
public void test5() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
Customer c = session.get(Customer.class, 2);
session.delete(c);
session.getTransaction().commit();
session.close();
}
/**
*
USE hibernatetest2
CREATE TABLE t_customer(
c_id INT PRIMARY KEY AUTO_INCREMENT,
c_name VARCHAR(20)
);
CREATE TABLE t_order(
c_id INT PRIMARY KEY AUTO_INCREMENT,
c_money DOUBLE,
c_receiverInfo VARCHAR(50),
c_customer_id INT
);
ALTER TABLE t_order ADD CONSTRAINT cus_id_fk FOREIGN KEY(c_customer_id) REFERENCES t_customer(c_id);
*/
}
customer.hbm.xml
<hibernate-mapping>
<class name="cn.domain.Customer" table="t_customer">
<id name="id" column="c_id">
<generator class="identity" />
</id>
<property name="name" column="c_name" length="20" />
<!-- 一个客户关联多个订单 -->
<set name="orders" inverse="true" cascade="all">
<key column="c_customer_id" />
<one-to-many class="cn.domain.Order" />
</set>
<!-- 使用set来描述在一的一方中关联的多 Set<Order>,它的name属性就是set集合的名称 key:它主要描述关联的多的一方产生的外键名称,注意要与多的一方定义的外键名称相同
one-to-many 描述集合中的类型 -->
</class>
</hibernate-mapping>
order.hbm.xml
<hibernate-mapping>
<class name="cn.domain.Order" table="t_order">
<id name="id" column="c_id">
<generator class="identity" />
</id>
<property name="money" column="c_money" />
<property name="receiverInfo" column="c_receiverInfo" length="50"/>
<!-- 多对一 -->
<many-to-one fetch="join" lazy="false" name="c" class="cn.domain.Customer" column="c_customer_id" cascade="all">
</many-to-one>
<!--
name属性它描述的是Order类中的一的一方的属性名称 Customer c;
class 代表一的一方的类型
column 描述的是一对多,在多的一方产生的外键的名称 c_customer_id
-->
</class>
</hibernate-mapping>
cascade总结
使用cascade可以完成级联操作
它可常用取值:
none这是一个默认值
save-update,当我们配置它时,底层使用save update或save-update完成操作,级联保存临时对象,如果是游离对象,会执行update.
delete 级联删除
delete-ophan 删除与当前对象解除关系的对象。
all 它包含了save-update delete操作
all-delete-orphan 它包信了delete-orphan与all操作
- cascade与inverse有什么区别?
1.cascade它是完成级联操作
2.Inverse它只有在双向关联情况下有作用,它来指定由哪一方维护外键。