Hibernate -- 一对多的双向关联关系

 

Hibernate -- 一对多的双向关联关系

 

Hibernate -- 一对多的双向关联关系

 

Hibernate -- 一对多的双向关联关系

Hibernate -- 一对多的双向关联关系

Hibernate -- 一对多的双向关联关系

Hibernate -- 一对多的双向关联关系

Hibernate -- 一对多的双向关联关系

 

示例代码: 

Customer.java

package cn.itcast.many2onedouble;

import java.util.HashSet;
import java.util.Set;
/**
 * 一的一端
 */
@SuppressWarnings("serial")
public class Customer implements java.io.Serializable {
	
	private Integer id;
	private String name;
	//一个客户对应多个订单
	private Set<Order> orderes=new HashSet<Order>(0);
	
	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 Set<Order> getOrderes() {
		return orderes;
	}
	public void setOrderes(Set<Order> orderes) {
		this.orderes = orderes;
	}

}

Order.java

package cn.itcast.many2onedouble;

/**
 * 多的一端
 */
public class Order {
	private Integer id;
	private String orderNumber;
	private Double price;
	
	//建立订单到客户的多一关联 
	private Customer customer;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getOrderNumber() {
		return orderNumber;
	}

	public void setOrderNumber(String orderNumber) {
		this.orderNumber = orderNumber;
	}

	public Double getPrice() {
		return price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

}


App.java

package cn.itcast.many2onedouble;

import java.util.Iterator;
import java.util.Set;

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

public class App {
	private static  SessionFactory sf=null;
	
	static{
		   Configuration config=new Configuration();
	       config.configure("cn/itcast/many2onedouble/hibernate.cfg.xml");
	       config.addClass(Customer.class);
	       config.addClass(Order.class);
	       sf=config.buildSessionFactory();
	}
	
      
		
		//知识点6:保存客户和订单(客户和订单建立双向关联)
		@Test
		public  void saveCustomerAndOrder(){
			   Session session=sf.openSession();
			   Transaction tx=session.beginTransaction();
			   
			   Customer c=new Customer();
			   c.setName("关羽");
			   
			   Order o=new Order();
			   o.setOrderNumber("NO1");
			   o.setPrice(12d);
			   
			   //建立订单和客户的双向关联
			   
			   //建立订单和客户的关联
			   o.setCustomer(c);
			   
			   //建立客户和订单的关联
			   c.getOrderes().add(o); 
			   
			   //保存客户
			   session.save(c);
			   
			   //保存订单
			   session.save(o);
			   
			   tx.commit();
			   session.close();
		}
		
		//知识点7:保存客户和不保存订单
		@Test
		public  void saveCustomerAndOrderCase(){
			   Session session=sf.openSession();
			   Transaction tx=session.beginTransaction();
			   
			   Customer c=new Customer();
			   c.setName("飞");
			   
			   Order o=new Order();
			   o.setOrderNumber("NO2");
			   o.setPrice(12d);
			   
			   //建立订单和客户的双向关联
			   
			   //建立订单和客户的关联
			   o.setCustomer(c);
			   
			   //建立客户和订单的关联
			   c.getOrderes().add(o); 
			   
			   //保存客户
			   session.save(c);
			   
			   //保存订单
			   //session.save(o);
			   
			   tx.commit();
			   session.close();
		}
		
		
		//知识点8:查询客户和订单
		@Test
		public  void getCustomer(){
			   Session session=sf.openSession();
			   Transaction tx=session.beginTransaction();
			   
			   //从一的一端开始查询
			   Customer c=(Customer)session.get(Customer.class, 2);
			   System.out.println(c.getId()+"  "+c.getName());
			   
			   Set<Order> set=c.getOrderes();
			   Iterator<Order>  it=set.iterator();
			   while(it.hasNext()){
				   Order o=it.next();
				   System.out.println(o.getId()+"   "+o.getOrderNumber()+"   "+o.getPrice());
			   }
		
			   tx.commit();
			   session.close();
		}
		
		
		//知识点9:对象导航
		@Test
		public  void objectRelation(){
			   Session session=sf.openSession();
			   Transaction tx=session.beginTransaction();
			   
			   Order o1=new Order();
			   o1.setOrderNumber("NO1");
			   o1.setPrice(23d);
			   
			   Order o2=new Order();
			   o2.setOrderNumber("NO2");
			   o2.setPrice(23d);
			   
			   
			   Order o3=new Order();
			   o3.setOrderNumber("NO3");
			   o3.setPrice(23d);
			   
			   
			   Customer c=new Customer();
			   c.setName("关羽");
			   
			   //order1关联到customer 而customer没有关联到order1 --单向关联
			   o1.setCustomer(c);
			   
			   
			   //customer关联到order2 order3   而order2 order3 没有关联到customer  单向关联
			   c.getOrderes().add(o2);
			   c.getOrderes().add(o3);
			   
			   //保存o1
			   session.save(o1);
			   //保存c
			   //session.save(c);
		
			   //保存o2
			   //session.save(o2);
			   
			   tx.commit();
			   session.close();
		}
		
		/*
		 * 知识点10:保持程序的健壮性
		 */
		@Test
		public  void testDouleRaletion(){
			   Session session=sf.openSession();
			   Transaction tx=session.beginTransaction();
			   
			   Customer c=new Customer();
			   c.setName("飞");
			   
			   Order o=new Order();
			   o.setOrderNumber("NO2");
			   o.setPrice(12d);
/************************************************************************************************************/			   
			   //建立订单和客户的双向关联
			   //建立订单和客户的关联
			   o.setCustomer(c);
			   
			   //建立客户和订单的关联
			   c.getOrderes().add(o); 
/************************************************************************************************************/			   
			   //保存客户
			   session.save(c);
			   
			   //保存订单
			   session.save(o);
			   
			   tx.commit();
			   session.close();
		}

/************************************************************************************************************/		
		
		//知识点11:订单变更客户
		//更改订单表id=6的customer_id=3更改为4
		@Test
		public  void changeOrderHander(){
			   Session session=sf.openSession();
			   Transaction tx=session.beginTransaction();
			   
			   //获取id=6号的订单,查询的订单和订单关联的客户放置在sessioln的一级缓存中,同时还产生一份快照
			   Order o6=(Order)session.get(Order.class, 6);
			   
			   //获取id=4客户
			   Customer c4=(Customer)session.get(Customer.class, 4);
			/**************************************************************************************/   
			   //建立关联关系
			   /*
			    * 在set标签中配置inverse="true",则多的一端说了算,一的一端说了不算
			    *     当缓存中的数据发生变化时
			    *       * 如果多的一端关联的客户发生变化,此时执行update语句
			    *       * 如果一的一端对应的订单集合中的订单发生变化时,
			    *         因为一的一端说了不算,所以不会按照订单集合中订单的变化执行update语句
			    */
			   
			   //让6号订单和4号客户关联
			   o6.setCustomer(c4);  //有update语句
			   
			   //在4号客户对应的订单集合中加入6号订单  
			   c4.getOrderes().add(o6);   //没有update语句,加和不加没有影响,但建议还是加上
			/**************************************************************************************/   
			   
			   tx.commit();
			   session.close();
		}	
		
		
		/*
		 * 知识点12:解除关联关系
         *     解除6号订单和3号客户的关联
		 */
		@Test
		public  void removeRelation(){
			   Session session=sf.openSession();
			   Transaction tx=session.beginTransaction();
			   
			   //获取id=6号的订单,查询的订单和订单关联的客户放置在sessioln的一级缓存中,同时还产生一份快照
			   Order o6=(Order)session.get(Order.class, 6);
			   
			   //获取id=3客户
			   Customer c3=(Customer)session.get(Customer.class, 3);
			   
			   //解除双方的关联关系
               o6.setCustomer(null);
               c3.getOrderes().remove(o6);
			   
			   tx.commit();
			   session.close();
		}	
		
		/*
		 * 知识点13:级联删除删除1号客户的同时,删除1号客户所关联的订单
		 */
		@Test
		public  void deleteCustomerCaseOrder(){
			   Session session=sf.openSession();
			   Transaction tx=session.beginTransaction();
			   
			   //获取id=1客户
			   Customer c1=(Customer)session.get(Customer.class, 1);
			   
               session.delete(c1);
			   
			   tx.commit();
			   session.close();
		}
		
		
		/*
		 * 知识点14:解除关联关系 ---父子关系
         *         解除6号订单和3号客户的关联,同时删除6号订单
		 */
		@Test
		public  void deleteOrderOrphan(){
			   Session session=sf.openSession();
			   Transaction tx=session.beginTransaction();
			   
			  
			   
			   //获取id=6订单
			   Order o6=(Order)session.get(Order.class, 6);
			   
			   //获取id=3客户
			   Customer c3=(Customer)session.get(Customer.class, 3);
			   
			   //解除关联关系
			   o6.setCustomer(null);
			   c3.getOrderes().remove(o6);
              
			   
			   tx.commit();
			   session.close();
		}
	
}


Customer.hbm.xml


Order.hbm.xml


hibernate.cfg.xml


 

相关文章:

  • 2021-04-19
  • 2022-01-12
  • 2021-11-11
  • 2021-11-06
  • 2022-01-24
  • 2021-09-08
  • 2021-06-10
  • 2021-06-23
猜你喜欢
  • 2021-07-03
  • 2021-08-06
  • 2021-08-07
  • 2021-11-06
  • 2022-02-19
  • 2022-01-27
相关资源
相似解决方案