为什么在 Hibernate 中版本号由 db 控制时,成功更新后需要额外的 SQL 查询?
Why an extra SQL query is needed after a successful update when version number controlled by db in Hibernate?
我正在阅读 this article 我不明白为什么当我们在 Hibernate 中将版本控制数据控制委托给数据库时,在成功更新后,需要另一个 SQL 查询来检索从数据库返回的版本号。
例子来了。我们有一个名为 Product 的实体。
这是映射配置:
<hibernate-mapping package=”example”>
<class name=”Product”>
<id name=”id”>
<generator class=”native” />
</id>
<version name=”version” type=”long” generated=”always”/>
<property name=”name” not-null=”true” />
</class>
</hibernate-mapping>
这些是更新产品后生成的查询:
Hibernate:
/* update example.Product */
update Product
set
name=?
where
id=?
and version=?
Hibernate:
/* get generated state example.Product */
select product_.version as version8_
from
Product product_
where
product_.id=?
我知道为什么需要版本控制,但我不明白的是为什么我们更新产品后要检索版本号 ...
额外的查询是必要的,因为休眠需要知道新的版本值。否则缓存的休眠实体需要失效。
当hibernate自己处理版本时,新值是已知的,所以不需要额外查询数据库。
我正在阅读 this article 我不明白为什么当我们在 Hibernate 中将版本控制数据控制委托给数据库时,在成功更新后,需要另一个 SQL 查询来检索从数据库返回的版本号。
例子来了。我们有一个名为 Product 的实体。
这是映射配置:
<hibernate-mapping package=”example”>
<class name=”Product”>
<id name=”id”>
<generator class=”native” />
</id>
<version name=”version” type=”long” generated=”always”/>
<property name=”name” not-null=”true” />
</class>
</hibernate-mapping>
这些是更新产品后生成的查询:
Hibernate:
/* update example.Product */
update Product
set
name=?
where
id=?
and version=?
Hibernate:
/* get generated state example.Product */
select product_.version as version8_
from
Product product_
where
product_.id=?
我知道为什么需要版本控制,但我不明白的是为什么我们更新产品后要检索版本号 ...
额外的查询是必要的,因为休眠需要知道新的版本值。否则缓存的休眠实体需要失效。 当hibernate自己处理版本时,新值是已知的,所以不需要额外查询数据库。