package test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import domain.Customer;
import domain.Linkman;
import utils.HibernateUtils;
public class Demo {
/*
* hibernate的级联一对多的级联保存与删除测试
* cascade为级联操作
* none 不使用级联
* save-update 级联保存或更新
* delete 级联删除
* delete-orphan 孤儿删除.(注意:只能应用在一对多关系)
* all 除了delete-orphan的所有情况.(包含save-update delete)
* all-delete-orphan 包含了delete-orphan的所有情况.(包含save-update delete delete-orphan)
*/
/*
* 测试孤儿删除,从一方的集合中删除多方中的一个值(注意:只能应用在一对多关系)
* cascade: delete-orphan
*/
@Test
public void demo4(){
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
Customer c = session.get(Customer.class, 1L);
Linkman l1 = session.get(Linkman.class, 1L);
//从集合中删除linkman对象,如不设置孤儿删除,只会修改多方的外键并未删除
c.getLinkmans().remove(l1);
//持久层对象自动保存
tr.commit();
}
/*
* 关联删除比较简单与关联保存相同,只需要在cascade添加delete属性就可了,
* cascade中多个属性用逗号隔开。
*
*/
@Test
public void demo3(){
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
Customer c = session.get(Customer.class, 1L);
//因为设置了关联删除,在删除客户的时候,该客户的联系人也会被一起删除
session.delete(c);
tr.commit();
}
/*
* 配置将Customer 方向的 cascade为设置为save-update,这样仅存储 一方就可以了
*也可以反向设置或者双向都设置。
*/
@Test
public void demo2(){
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
// 保存客户和联系人的数据
Customer c1 = new Customer();
c1.setCust_name("美美");
// 创建2个联系人
Linkman l1 = new Linkman();
l1.setLkm_name("熊大");
Linkman l2 = new Linkman();
l2.setLkm_name("熊二");
// 单向关联
c1.getLinkmans().add(l1);
c1.getLinkmans().add(l2);
// 保存数据,在保存数据的方向设置 cascade为save-update
session.save(c1);
//客户已经设置自动关联且外键已经添加了两个联系人,这两个联系人就不用手动保存了。
// session.save(l1);
// session.save(l2);
tr.commit();
}
/*
* 测试手动双向链接,配置文件中不配置cascade属性,或为none
*/
@Test
public void demo1() {
Session session = HibernateUtils.getSession();
Transaction tr = session.beginTransaction();
//创建用户与联系人
Customer c = new Customer();
c.setCust_name("alex");
Linkman l1 = new Linkman();
l1.setLkm_name("alex_linkman1");
Linkman l2 = new Linkman();
l2.setLkm_name("alex_linkman1");
//设置双向链接
c.getLinkmans().add(l1);
c.getLinkmans().add(l2);
l1.setCustomer(c);
l2.setCustomer(c);
//保存数据
session.save(c);
session.save(l1);
session.save(l2);
tr.commit();
session.close();
}
}