繁体   English   中英

关于级联,休眠中的 save() 和 persists() 方法有什么区别?

[英]what's the difference between save() and persists() methods in hibernate regarding with cascading?

在此处输入图片说明

                                     EER Diagram

*请注意,课程实体与此问题无关

这里我使用 save() 方法将 Instructor 的一个对象保存到数据库中。 [Instructor 和 InstructorDetails 有一个允许一对一双向级联的关系,因此保存讲师对象也会保存讲师详细信息对象]。在这种情况下,我得到了对象错误引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例。但是当我使用persists() 方法时,它没有出现。 因此,但是当我将级联类型更改为 CascadeType.ALL 时,save() 方法也没有问题。但是您可以看到我仅在以下代码中删除了 REMOVE 的级联类型,那么它将如何影响像 save() 这样的方法?

教师模型类

公共课讲师{

@OneToOne(cascade={CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
//Here you can see I just only neglected the cascade type of REMOVE only 
@JoinColumn(name="instructor_detail_id")
private InstructorDetails instructorDetail;
//
//

}

InstructorDetails 模型类

公共类 InstructorDetails{

 @OneToOne(mappedBy ="instructorDetail",cascade = 
{CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH} )
//Here you can see I just only neglected the cascade type of REMOVE only 
private Instructor instructor;
//
//

}

persist()使瞬态实例持久化。 但是,它不保证标识符值会立即分配给持久化实例,分配可能发生在刷新时间。 persist()还保证如果在事务边界之外调用它,它不会执行 INSERT 语句。

save()确实保证返回一个标识符。 如果必须执行 INSERT 以获取标识符(例如“身份”生成器,而不是“序列”),则此 INSERT 会立即发生,无论您是在事务内部还是外部。

您可以在Hibernate 文档页面上了解更多信息,第11.2 使对象持久化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM