package com.rlovep.many2many;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
public class App {
private static SessionFactory sf=null;
static{
Configuration config=new Configuration().configure().addClass(Project.class).addClass(Developer.class);
//创建serviceRegistry 代替buildSessionFactory()方法
ServiceRegistry serviceRegistry =new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// 创建session的工厂对象
sf = config.buildSessionFactory(serviceRegistry);
}
// 多对多
//1. 设置inverse属性,对保存数据影响?
// 有影响。
// inverse=false ,有控制权,可以维护关联关系; 保存数据的时候会把对象关系插入中间表;
// inverse=true, 没有控制权, 不会往中间表插入数据。
@Test
public void testSave(){
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
//创建项目
Project project1=new Project();
Project project2=new Project();
project1.setName("ptool1");
project2.setName("ptool2");
//创建员工对象
Developer developer1=new Developer();
Developer developer2=new Developer();
Developer developer3=new Developer();
developer1.setName("peace1");
developer2.setName("peace2");
developer3.setName("peace3");
//创建关系
/*
* 工程1:peace1,peace2
* 工程2:peace2,peace3
* peace1:工程1
* peace2:工程1和2
* peace3:工程2
*
*/
/*project1.getDevelopers().add(developer1);
project1.getDevelopers().add(developer2);
project2.getDevelopers().add(developer3);
project2.getDevelopers().add(developer2);*/
developer1.getProjects().add(project1);
developer2.getProjects().add(project1);
developer2.getProjects().add(project2);
developer3.getProjects().add(project2);
session.save(developer3);
session.save(developer2);
session.save(developer1);
tx.commit();
session.close();
}
//2 .设置inverse属性, 对获取数据影响? 无
@Test
public void testGet(){
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
Project project=(Project)session.get(Project.class, 7);
System.out.println(project.getName());
System.out.println(project.getDevelopers());
tx.commit();
session.close();
}
//3. 设置inverse属性, 对解除关系影响?
// 有影响。
// inverse=false ,有控制权, 解除关系就是删除中间表的数据。
// inverse=true, 不能解除
@Test
public void removeRelation() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
Project project=(Project)session.get(Project.class, 7);
project.getDevelopers().clear();
tx.commit();
session.close();
}
//3. 设置inverse属性,对删除数据的影响?
// inverse=false, 有控制权。 先删除中间表数据,再删除自身。
// inverse=true, 没有控制权。 如果删除的数据有被引用,会报错! 否则,才可以删除
@Test
public void deleteData() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
Project project=(Project)session.get(Project.class, 7);
session.delete(project);
tx.commit();
session.close();
}
}