示例代码:
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