Hibernate一对多操作

2021-06-10 04:03

阅读:697

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


评论


亲,登录后才可以留言!