hibernate_day03_






之后:


关键代码:




全部代码:com.hlg.hibernatetest.HibernateOnetoMany

package com.hlg.hibernatetest;

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

import com.hlg.entity.Customer;
import com.hlg.entity.LinkMan;
import com.hlg.utils.HibernateUtils;

public class HibernateOnetoMany {

	//一对多 级联保存
	@Test
	public void testOneToMany(){
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction tx = null;
		
		try{
			sessionFactory = HibernateUtils.getSessionFactory();
			session = sessionFactory.openSession();
			tx = session.beginTransaction();
			
			// 添加一个客户,为这个客户添加一个联系人
						//1 创建客户和联系人对象
			Customer customer = new Customer();
			customer.setCustName("传智播客");
			customer.setCustLevel("vip");
			customer.setCustSource("网络");
			customer.setCustPhone("110");
			customer.setCustMobile("999");
						
			LinkMan linkman = new LinkMan();
			linkman.setLkm_name("lucy");
			linkman.setLkm_gender("男");
			linkman.setLkm_phone("911");
						
			//2 在客户表示所有联系人,在联系人表示客户		
			// 建立客户对象和联系人对象关系
			//2.1 把联系人对象 放到客户对象的set集合里面
			customer.getSetLinkMan().add(linkman);
			//2.2 把客户对象放到联系人里面
			linkman.setCustomer(customer);
						
			//3 保存到数据库
			session.save(customer);
			session.save(linkman);
			
			//提交事务
			tx.commit();
			
		}catch(Exception e){
			//回滚事务
			tx.rollback();
		}finally{
			//关闭
			session.close();
			sessionFactory.close();
		}
	}
	
	//一对多 级联保存   简化写法
		@Test
		public void testOneToMany2(){
			SessionFactory sessionFactory = null;
			Session session = null;
			Transaction tx = null;
			
			try{
				sessionFactory = HibernateUtils.getSessionFactory();
				session = sessionFactory.openSession();
				tx = session.beginTransaction();
				
				// 添加一个客户,为这个客户添加一个联系人
							//1 创建客户和联系人对象
				Customer customer = new Customer();
				customer.setCustName("迅雷");
				customer.setCustLevel("普通客户");
				customer.setCustSource("网络");
				customer.setCustPhone("110");
				customer.setCustMobile("999");
							
				LinkMan linkman = new LinkMan();
				linkman.setLkm_name("小雷111");
				linkman.setLkm_gender("男");
				linkman.setLkm_phone("911");
							
				//2  把联系人放到客户里面		
				customer.getSetLinkMan().add(linkman);
				//3 保存到数据库
				session.save(customer);
				
				//提交事务
				tx.commit();
				
			}catch(Exception e){
				//回滚事务
				tx.rollback();
			}finally{
				//关闭
				session.close();
				sessionFactory.close();
			}
		}
		
		//一对多 级联保存   简化写法
		@Test
		public void testDelete(){
			SessionFactory sessionFactory = null;
			Session session = null;
			Transaction tx = null;
			
			try{
				sessionFactory = HibernateUtils.getSessionFactory();
				session = sessionFactory.openSession();
				tx = session.beginTransaction();
				
				//1 根据ID查询客户对象
				Customer customer = session.get(Customer.class, 3);
				
				//2  删除
				session.delete(customer);
				
				//提交事务
				tx.commit();
				
			}catch(Exception e){
				//回滚事务
				tx.rollback();
			}finally{
				//关闭
				session.close();
				sessionFactory.close();
			}
		}
		
		//一对多 级联修改 
		@Test
		public void testUpdate(){
			SessionFactory sessionFactory = null;
			Session session = null;
			Transaction tx = null;
			
			try{
				sessionFactory = HibernateUtils.getSessionFactory();
				session = sessionFactory.openSession();
				tx = session.beginTransaction();
				
				//1 根据ID查询客户对象 和 联系人对象
				Customer customer = session.get(Customer.class, 4);
				LinkMan linkMan = session.get(LinkMan.class, 1);
				
				//2 设置持久态值
				//把联系人放到客户里面
				customer.getSetLinkMan().add(linkMan);
				//把客户放到联系人里面
				linkMan.setCustomer(customer);
				
				//提交事务
				tx.commit();
				
			}catch(Exception e){
				//回滚事务
				tx.rollback();
			}finally{
				//关闭
				session.close();
				sessionFactory.close();
			}
		}
}


2 inverse属性
(1)因为hibernate双向维护外键,在客户和联系人里面都需要维护外键,修改客户时候修改一次外键,修改联系人时候也修改一次外键,造成效率问题



(2)解决方式:让其中的一方不维护外键
- 一对多里面,让其中一方放弃外键维护
- 一个国家有总统,国家有很多人,总统不能认识国家所有人,国家所有人可以认识总统


(3)具体实现:
在放弃关系维护映射文件中,进行配置,在set标签上使用inverse属性






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值