程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在前端使用Hibernate乐观锁定版本属性?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在前端使用Hibernate乐观锁定版本属性??

开发过程中遇到如何在前端使用Hibernate乐观锁定版本属性?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在前端使用Hibernate乐观锁定版本属性?的解决方法建议,希望对你解决如何在前端使用Hibernate乐观锁定版本属性?有所启发或帮助;

您 需要使用DTO吗?如果要传递实际的实体,就不会有这个问题-也不必再次加载该实体,这对性能而言并不是很好。

但是,即使您确实有使用DTO的正当理由,我也不太了解为什么要在保存之前尝试在 实体上更新版本号。虑工作流中可能的不同方案:

  1. 实体最初已加载,版本为V1
  2. 它已传输到DTO,该DTO进入UI,返回并准备保存。
  3. 实体再次加载,版本为V2

您现在有两种可能性:

  1. V1 == V2。Peachy,您无需执行任何操作。
  2. V1小于V2,这意味着您在编辑实体时实体是由其他人更新的。没有必要尝试将版本设置为V1并尝试保存,因为保存会失败。您可以使用V2保存它(从而覆盖其他人的更改),也可以立即失败(不涉及Hibernate)。

解决方法

使用版本属性对实体进行乐观锁定可以很好地实现,并且易于实现:

<version property="VERSION" type="int" column="EX_VERSION" />

实体具有以下类型的属性:

private int version;
public int getVERSION() { return VERSION; }
public void setVERSION(int version) { this.VERSION = VERSION; }

到目前为止,一切都很好。现在,服务方法返回上述实体的数据传输对象(DTO),视图以HTML形式显示。对于更新页面,VERSION属性存储在HTML隐藏字段中,并与表单一起提交。

目的是使用version属性来确保如果显示的信息带有旧版本,则用户的更新将失败。

控制器通过调用包含更新信息(包括版本属性)的DTO的服务方法来响应用户更新请求,然后该服务方法使用数据访问对象(DAO)来保存更改:

public void update(SimpleDTO dto) {
    SimplyEntity entity = getSimpleDao().load(dto.getId());
    copyProperties(dto,entity); // all properties,including VERSION copied to entity
    getSimpleDao().update(entity);
}

问题是Hibernate不尊重通过copyProperties(&Hellip;)复制到实体中的version属性。我在以下论坛中找到了原因:https://forum.hibernate.org/viewtopic.php?f
= 1&t = 955893&p =
2418068

简而言之,当调用load()时,Hibernate将version属性缓存在会话缓存中,随后将其值更改为什么都无关紧要。我同意这是正确的行为,但Bosses指示我通过HTML表单属性传递版本(如果对此有更好的模式,我很乐意听到)。

我现在正在探索的一种解决方案是在更新发生之前使用hibernateTemplate.evict(simpleEntity)设置实体的版本后,将其从会话中退出。我希望这能奏效,但似乎效率不高。

我想请Hibernate检查实例本身的version属性,而不是仅从会话缓存中检查。

预先感谢您的答复!

-LES

大佬总结

以上是大佬教程为你收集整理的如何在前端使用Hibernate乐观锁定版本属性?全部内容,希望文章能够帮你解决如何在前端使用Hibernate乐观锁定版本属性?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。