哪个解决方案是好的做法hibernate在数据库中保存数据?

时间:2011-04-27 12:39:48

标签: mysql hibernate hibernate-mapping

我有两个实体,即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

2 个答案:

答案 0 :(得分:2)

解决方案1不会发出SQL查询来加载Class。与get()不同,load()返回具有指定标识符的代理对象,并且不会立即执行数据库查询。因此,load()方法是此方案的自然选择(当您实际需要加载对象时,请使用get())。

解决方案2的可能副作用取决于关系的级联配置等。即使它在当前情况下工作正常,它也会使代码更加脆弱,因为代码中看似无关的更改可能会破坏它。

因此,我建议您使用解决方案1,不要担心性能。

答案 1 :(得分:1)

  

解决方案2中是否有任何副作用?

首先,你没有将你的学生与那里的任何课程联系起来。

其次,在一般情况下,您从哪里获得该类ID?在某个较早的时间点,您必须从数据库中获取现有的类实例,或者创建一个新实例并将其保留,以便获得其ID。当然,重用一个你已经拥有的实体是好的,但是像你上面那样玩ids就是恕我直言。

第三,过早优化您的应用不是一个好主意。首先让它正常工作,然后测量性能,并仅在需要时进行优化。