临时问题记录-Hibernate保存主从表数据的入口

本文详细解析使用Hibernate保存从表数据时,选择主表或从表作为入口点的区别,以及可能导致的SQL语句差异。通过案例分析,帮助开发者避免常见错误并优化数据操作。

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

最近用hibernate做项目,发现hibernate的问题细节很多,顺手记录下来。


今天跑了一个测试用例,发现保存的时候生成的sql语句,情况不是预期的,我就奇怪了,
后来对照了半天代码才发现,原来是我在做保存的时候,选择的主从表入口点不同,造成了不同的效果。

用hibernate保存从表数据的时候,我们可能选择的入口点也不同。
1 以主表为入口点来保存,
2 以从表为入口点来保存。
3 hql/sql语句或者结构化对象查询 来保存。

现在针对1,2点的情况来说明 如果以主表为入口点保存,
例如CLASS-STUDENT 的一对N关系
此时我们要保存STUDENT对象。

如果以CLASS类为入口点的话,
必须这么做:

Class(班级) class = service.getStudent("id");
Student s = new Student();
s.setClass(class);
classService.save(class);

错误的做法:

Class class =new Class(); class.setId("id");
s.setClass(class);
classService.save(class);

错误的做法会造成一条新的insert语句。

如果以Student为入口点的话:
class对象就不必须是一个持久化态的实例,class可以是一个临时态的实例。
我们可以这么做:
Class class = new Class();
class.setId("id");//此时class是一个瞬时状态的实例,也可以成为临时态
stu.setClass(class);
StuService.saveStu(stu);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值