我最近发表了关于使用Hibernate的Java持久性一书的以下声明。我能够理解除突出显示之外的所有其他内容。
要考虑的另一个问题是脏检查。 Hibernate自动检测 对象状态更改,以便将更新后的状态与数据库同步。 从getter方法返回一个不同的对象通常是安全的 Hibernate传递给setter的对象。 Hibernate比较对象 值 - 不是通过对象标识 - 来确定属性是否持久化 国家需要更新。例如,以下getter方法没有 导致不必要的SQL UPDATE:
public String getFirstname() {
return new String(firstname);
}
查询:我的关注点是,我们正在创建新实例。这真的有必要吗?如果我在这里错了,请好好纠正我。
答案 0 :(得分:2)
如果你将从getter返回不同的对象,这意味着你正在尝试创建一个防御性副本。
从hibernate的角度来看,如果从getter返回不同的对象,那么该对象将没有hibernate会话的历史记录,如果你将在该对象上调用save并且该对象已经存在于数据库中,那么你将需要ConstraintViolationException
,你必须调用{ {1}}而是。调用saveOrUpdate
将导致hibernate在提交之前向数据库发出select语句。
如果某个对象已经在会话中,并且在执行某些更改后调用了commit,Hibernate将发出更新查询