【问题标题】:which solution is good practice hibernate save data in database?哪种解决方案是好的做法hibernate将数据保存在数据库中?
【发布时间】:2011-08-13 20:07:27
【问题描述】:

我有两个实体,分别是 Student 和 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,另一个是插入 student。但在解决方案 2 中只需要一个 SQL。如果我有更多的类属性, 我将在插入之前加载并发出更多选择 sql。似乎效率不高。方案二有副作用吗?

哪种保存/插入方式更好?顺便说一句,我没有设置级联。

谢谢 陈奕

【问题讨论】:

    标签: mysql hibernate hibernate-mapping


    【解决方案1】:

    方案2有副作用吗?

    首先,您还没有将您的学生与那里的任何班级相关联。

    其次,在一般情况下,您从哪里获得该类 ID?在较早的某个时间点,您必须要么从数据库中获取现有的类实例,要么创建一个新实例并将其持久化,以便获得它的 id。当然,重用你已经拥有的实体很好,但是像上面那样处理 id 不是恕我直言。

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

    【讨论】:

    • 我的错!再次修改问题
    • 谢谢你的回复。对不起我的解释。是的,我已经从数据库中获取了一个现有的类实例并存储了 id。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的帮助。 Emmmnn.. 有道理!
    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多