Hibernate一对多操作
2021-06-10 04:03
package com.siwuxie095.hibernatetest;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;
import com.siwuxie095.entity.Customer;
import com.siwuxie095.entity.LinkMan;
import com.siwuxie095.utils.HibernateUtils;
//一对多操作
public class HibernateOneToMany {
/**
* 一对多级联保存的复杂写法
*
*
* 手动加上 @Test 以进行单元测试(将自动导入 JUnit 4 的 jar 包)
*
* 选中方法名,右键->Run As->JUint Test
*/
@Test
public void testSave(){
SessionFactory sessionFactory=null;
Session session=null;
Transaction tx=null;
try {
//得到 SessionFactory 对象
sessionFactory=HibernateUtils.getSessionFactory();
//创建 Session 对象
session=sessionFactory.openSession();
//开启事务
tx=session.beginTransaction();
//添加一个客户,为这个客户添加一个联系人
//(1)
//创建客户和联系人对象
Customer customer=new Customer();
customer.setCustName("百度");
customer.setCustLevel("VIP");
customer.setCustSource("网络");
customer.setCustPhone("110");
customer.setCustMobile("114");
LinkMan linkMan=new LinkMan();
linkMan.setLkmName("小明");
linkMan.setLkmGender("男");
linkMan.setLkmPhone("111");
//(2)
//建立客户对象和联系人对象的关系
//
//在客户实体类中表示联系人,在联系人实体类中表示客户
//
//具体:
//把联系人对象放到客户对象的 Set 集合中
//把客户对象放到联系人对象中
customer.getLinkManSet().add(linkMan);
linkMan.setCustomer(customer);
//(3)
//保存到数据库(级联保存)
session.save(customer);
session.save(linkMan);
//提交事务
tx.commit();
} catch (Exception e) {
//回滚事务
tx.rollback();
} finally {
//关闭资源
session.close();
sessionFactory.close();
}
}
/**
* 一对多级联保存的简化写法
*
* 在客户的映射配置文件中的 set 标签
* 添加 cascade 属性,并将其值设置为
* save-update
*/
@Test
public void testSaveX(){
SessionFactory sessionFactory=null;
Session session=null;
Transaction tx=null;
try {
//得到 SessionFactory 对象
sessionFactory=HibernateUtils.getSessionFactory();
//创建 Session 对象
session=sessionFactory.openSession();
//开启事务
tx=session.beginTransaction();
//添加一个客户,为这个客户添加一个联系人
//(1)
//创建客户和联系人对象
Customer customer=new Customer();
customer.setCustName("谷歌");
customer.setCustLevel("普通");
customer.setCustSource("网络");
customer.setCustPhone("911");
customer.setCustMobile("995");
LinkMan linkMan=new LinkMan();
linkMan.setLkmName("小强");
linkMan.setLkmGender("男");
linkMan.setLkmPhone("999");
//(2)
//建立客户对象和联系人对象的关系
//
//在客户实体类中表示联系人
//
//具体:
//把联系人对象放到客户对象的 Set 集合中
customer.getLinkManSet().add(linkMan);
//(3)
//保存到数据库(级联保存)
session.save(customer);
//简化所在:不用把客户对象放到联系人对象
//中,且最后不用保存联系人对象
//提交事务
tx.commit();
} catch (Exception e) {
//回滚事务
tx.rollback();
} finally {
//关闭资源
session.close();
sessionFactory.close();
}
}
/**
* 一对多级联删除
*
* 在客户的映射配置文件中的 set 标签
* 添加 cascade 属性,并将其值设置为
* delete
*/
@Test
public void testDelete(){
SessionFactory sessionFactory=null;
Session session=null;
Transaction tx=null;
try {
//得到 SessionFactory 对象
sessionFactory=HibernateUtils.getSessionFactory();
//创建 Session 对象
session=sessionFactory.openSession();
//开启事务
tx=session.beginTransaction();
//删除一个客户,并将这个客户中的所有联系人删除
//(1)
//根据 id 查询客户对象
Customer customer=session.get(Customer.class, 1);
//(2)
//调用 Session 的 delete() 方法实现级联删除
session.delete(customer);
//提交事务
tx.commit();
} catch (Exception e) {
//回滚事务
tx.rollback();
} finally {
//关闭资源
session.close();
sessionFactory.close();
}
}
/**
* 一对多修改
*
* 在客户的映射配置文件中的 set 标签
* 添加 inverse 属性,并将其值设置为
* true
*/
@Test
public void testUpdate(){
SessionFactory sessionFactory=null;
Session session=null;
Transaction tx=null;
try {
//得到 SessionFactory 对象
sessionFactory=HibernateUtils.getSessionFactory();
//创建 Session 对象
session=sessionFactory.openSession();
//开启事务
tx=session.beginTransaction();
//在百度工作的小明跳槽到谷歌,修改联系人表中对应的外键
//(1)
//根据 id 分别查询客户(谷歌)和联系人(小明)
Customer customer=session.get(Customer.class, 2);
LinkMan linkMan=session.get(LinkMan.class, 1);
//(2)
//设置持久态对象的值:
//1)把联系人对象放到客户对象的 Set 集合中
//2)把客户对象放到联系人对象中
customer.getLinkManSet().add(linkMan);
linkMan.setCustomer(customer);
//持久态对象可以自动更新数据库,所以下面的代码不用写
//session.update(customer);
//session.update(linkMan);
//提交事务
tx.commit();
} catch (Exception e) {
//回滚事务
tx.rollback();
} finally {
//关闭资源
session.close();
sessionFactory.close();
}
}
}
上一篇:js中,类的继承
下一篇:HTML 基本标签02