Hibernate有一些方法,以这种或那种方式,获取对象并将其放入数据库.它们之间有什么区别,什么时候使用哪个,为什么不存在一个知道何时使用什么的智能方法?
到目前为止我发现的方法是:
save()update()saveOrUpdate()saveOrUpdateCopy()merge()persist()任何人都可以告诉我在Hibernate中load()vs get()的优势是什么?
通过文档我可以发现只有一个区别是save方法生成返回对象作为生成的标识符但是persist没有.这是提供持久化方法的唯一目的.如果它是如何帮助程序员因为即使他不打算要使用生成的标识符,他可以使用save并忽略返回值.
还通过这个帖子来了解 Hibernate中persist()vs save()的优点是什么?.我可以从这个线程获得的有意义的语句是persist()还保证如果在事务边界之外调用它不会执行INSERT语句,保存方法但不确定我应该如何在我的程序中尝试它以便我可以得到实际的差异?
我有3个类对应3个表V,D和P.D有一个FK到V(FK_V)并使用OneToMany关系加入.也是他们退出4台 V_D_P具有的这些关系V,D和P.
以下是这些数据模型的样子:
@Entity
@Table(name = "V")
public class V {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "ID")
private Long id;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "FK_V", referencedColumnName="Id", nullable = false)
private Set<D> d;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "FK_V", referencedColumnName="Id", nullable = false)
private Set<V_D_P> vdp;
//Getters Setters etc.
}
@Entity
@Table(name = "V_D_P")
public class V_D_P {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = …Run Code Online (Sandbox Code Playgroud) 在hibernate保存对象之前,如何获取对象的生成ID.这是代码:
@Id
@SequenceGenerator(name="MY_SEQ", sequenceName="MY_SEQ", allocationSize=1 )
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="MY_SEQ")
private long id;
Run Code Online (Sandbox Code Playgroud)
有没有办法在不使用currval选择('MY_SEQ')的情况下做到这一点?
谢谢
当我试图理解 Hibernate Save 和 persist 之间的时候,我遇到了这个解释:
persist() 定义明确。它使瞬态实例持久化。但是,它不保证标识符值会立即分配给持久化实例,分配可能发生在刷新时间。规范没有这么说,这就是我在使用 persist() 时遇到的问题。
persist() 还保证如果在事务边界之外调用它,它不会执行 INSERT 语句。这在具有扩展会话/持久性上下文的长时间运行的对话中很有用。
需要像persist()这样的方法。
save() 不保证相同,它返回一个标识符,并且如果必须执行 INSERT 来获取标识符(例如“身份”生成器,而不是“序列”),无论您是否在里面,这个 INSERT 都会立即发生或在交易之外。这在具有扩展会话/持久性上下文的长时间运行的对话中并不好。
你能帮我理解坚持的线条说:
persist() 还保证如果在事务边界之外调用它,它不会执行 INSERT 语句。这在具有扩展会话/持久性上下文的长时间运行的对话中很有用。
这里的交易边界是什么?什么是长时间的对话?扩展会话/持久上下文是什么意思?
也用于保存方法:
无论您是在事务内部还是外部,此 INSERT 都会立即发生。这在具有扩展会话/持久性上下文的长时间运行的对话中并不好。
我知道如果我们在我的程序中使用 save 方法来保存对象,我们不需要像 session.beginTransaction() 和 session.getTransaction().commt() 这样的语句。如果声明在这里说同样的话,请告诉我。那么这在长时间运行的对话中有什么用呢?
我是 hibernate 的新手,很难理解这些差异,你能帮我理解这些差异吗?