hibernate--关系映射CRUD

本文详细介绍了Hibernate框架中CascadeType和FetchType的概念及其使用方法。包括CascadeType的四种类型:ALL、PERSIST、REFRESH、MERGE的具体应用场景,并通过实例演示了如何在save、update和delete操作中使用级联。此外,还讲解了FetchType的两种类型:lazy和eager在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CRUD中主要学习了

1.cascade=(CascadeType.*)
2.fetch=FetchType.*

这两者都是级联操作,就是删除一方时,另一方也相应删除。

前者主要是用于增删查找,常用于save(),update(),delete()等,后者主要是get(),load()操作.

一.Cascade

CascadeType有四种类型ALL,PERSIST,REFRESH,MERGE

CascadeType.ALL最常用的,只要不是读取,都能这么写

1.save(),persist()

save()或者是persist()//由于hibernate要与其他工具相关联,所以用save必须设定为CascadeType.ALL,persist还可以是CascadeType.PERSIST

@Test
public void testSaveGroup(){ 
 User u1 =new User();
 u1.setName("u1");
 User u2 =new User();
 u2.setName("u2");
 Group g =new Group();
 g.setId(1);
 g.setName("g1");
 g.getUsers().add(u1);//设定group和user的关系,即g对象到u1,1对多的关系
 g.getUsers().add(u2);
 u1.setGroup(g);//把g_id的值写入user中
 u2.setGroup(g);
 Session s = sf.getCurrentSession();
 s.beginTransaction();
 s.persist(g);    //不用cascade的话, s.persist(g);     s.persist(u);    也可以
// s.save(u);
 s.getTransaction().commit();
 }

2.update()或merge(),与之前类似,CascadeType.MERGE

常用的文档说明里面的update()应该是脱机态,到持久态。

@Test
public void testUpdate2User(){ 
 testSaveGroup();
 
 Session s = sf.getCurrentSession();
 s.beginTransaction();
 User u = (User)s.get(User.class, 1);
 s.getTransaction().commit();
 u.getGroup().setName("aaaa");  //这里其实是给Group 中的group.name设置值,所以结果自然在表中
 u.setName("qqqq");
 
 Session s1 = sf.getCurrentSession();
 s1.beginTransaction();
 s1.update(u);
 s1.getTransaction().commit();
}

另一种

@Test
public void testUpdate1User(){ 
 testSaveGroup();
 
 Session s = sf.getCurrentSession();
 s.beginTransaction();
 User u = (User)s.get(User.class, 1);
 
 u.getGroup().setName("qwe");  
 u.setName("asd");
 
 s.getTransaction().commit();
}

3.delete()

直接级联删除很容易,但是,只是部分删除,比较复杂,常用hql语句来写


 for(User u : g.getUsers())//是因为g.getUsers是数组,必须这么写,相当于遍历了与g这个实例下的相关user表中的ID

{
 u.setGroup(null);   //给user中的g_id设为 null值,group中不能设为CascadeType.ALL


 }
 s.delete(g);

 s.getTransaction().commit();
}

两者等价,后者用到HQL语句

 for(User u : g.getUsers()){
 s.createQuery("update User u set u.group=null where u.group="+g.getId()).executeUpdate();
 }
 s.createQuery("delete from Group g where g.id="+g.getId()).executeUpdate(); from的是类和对象,这点关键
s.getTransaction().commit();


g.getUsers().setName()  //给User类中的某个对象设置值

二.FetchType有两种类型

lazy,eager

其作用主要是,级联取东西

many-to-one默认是eager//就是马上取

one-to-many默认是lazy//不取,除非是用到了才弄

一般不同时设eager,用默认,或者是两个都是lazy

get()和load的区别如前所述

@Test
public void testLoadGroup(){ 
 testSaveGroup();
 
 Session s = sf.getCurrentSession();
 s.beginTransaction();
 Group g= (Group)s.load(Group.class, 1);

 for (User u : g.getUsers()) {  
  System.out.println(u.getName());
 }
 s.getTransaction().commit(); 
}

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值