Hibernate关联映射

测试类

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它只有在双向关联情况下有作用,它来指定由哪一方维护外键。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值