java - 是否有必要从 getter 方法返回一个与 Hibernate 传递给 setter 的对象不同的对象?

标签 java performance hibernate jpa

我最近在Java persistence with Hibernate一书中看到了以下陈述。除了突出显示的部分之外,我能够理解其他所有内容。

另一个需要考虑的问题是脏检查。 Hibernate自动检测 对象状态更改以便将更新后的状态与数据库同步。 从 getter 方法返回与 getter 方法不同的对象通常是安全的 Hibernate 传递给 setter 的对象。 Hibernate 通过以下方式比较对象: 值(而不是对象标识)来确定属性是否持久 状态需要更新。例如,下面的 getter 方法不 导致不必要的 SQL 更新:

public String getFirstname() {
return new String(firstname);
}

查询:我关心的是我们正在创建实例。这真的有必要吗?如果我错了,请纠正我..

最佳答案

如果您从 getter 返回不同的对象,则意味着您正在尝试创建防御性副本。 从hibernate的角度来看,如果您从getter返回不同的对象,则该对象将没有hibernate session 的历史记录,并且如果您将在该对象上调用save并且该对象已存在于数据库中,您将得到ConstraintViolationException,您有改为调用 saveOrUpdate 。调用 saveOrUpdate 将导致 hibernate 在提交之前向数据库发出 select 语句。

如果某个对象已经在 session 中,并且您在执行一些更改后调用提交,Hibernate 将发出更新查询

关于java - 是否有必要从 getter 方法返回一个与 Hibernate 传递给 setter 的对象不同的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20321617/

相关文章:

mysql - MyISAM 与 InnoDB 的 BI/批处理查询性能(即_NOT_OLTP)

java - Hibernate 无法读取或写入 org.joda.time.LocalDate

java - 计算文本中跳过空行的行数

java - Java 和 Hibernate 中的 ArrayIndexOutOfBoundsException

java - 在 Java 8 中,我可以使用流来过滤部分字符串吗?

java - Sonar 扫描仪分析在 util.lang.ConcreteReceiverGuard 上挂起

python - 给数组切片赋值很慢

performance - Where-Object或Compare-Object哪个更好?

java - 实体 equals()、hashCode() 和 toString()。如何正确实现它们?

java - 带有条件 api 的子查询和别名