我有两个实体,即Student和Class实体。 学生和班级是多对一的关系。所以学生包含了class属性。
现在我想保存或创建一个与现有班级相关的学生助理(意味着我已经知道主键ID)。
解决方案1:
Student student = new Student();
Class class = session.load(classId);
student.setClass(class);
session.save(student);
解决方案2:
Student student = new Student();
Class class = new Class();
class.setClassId(classId);
student.setClass(class);
session.save(student);
我的问题在于解决方案1它将发出两个SQL,一个是获取Class另一个是插入学生。但是在解决方案2中只需要一个SQL。如果我有更多的class属性, 我会在插入之前加载并发出更多select sql。看起来效率不高。解决方案2中是否存在任何副作用?
哪种方式做保存/插入更好?顺便说一句,我没有设置级联。
谢谢 Yee Chen
答案 0 :(得分:2)
解决方案1不会发出SQL查询来加载Class
。与get()
不同,load()
返回具有指定标识符的代理对象,并且不会立即执行数据库查询。因此,load()
方法是此方案的自然选择(当您实际需要加载对象时,请使用get()
)。
解决方案2的可能副作用取决于关系的级联配置等。即使它在当前情况下工作正常,它也会使代码更加脆弱,因为代码中看似无关的更改可能会破坏它。
因此,我建议您使用解决方案1,不要担心性能。
答案 1 :(得分:1)
解决方案2中是否有任何副作用?
首先,你没有将你的学生与那里的任何课程联系起来。
其次,在一般情况下,您从哪里获得该类ID?在某个较早的时间点,您必须从数据库中获取现有的类实例,或者创建一个新实例并将其保留,以便获得其ID。当然,重用一个你已经拥有的实体是好的,但是像你上面那样玩ids就是恕我直言。
第三,过早优化您的应用不是一个好主意。首先让它正常工作,然后测量性能,并仅在需要时进行优化。