gpt4 book ai didi

java - Hibernate 版本控制/乐观锁定本身是否会使实例变脏

转载 作者:太空宇宙 更新时间:2023-11-04 09:18:47 24 4
gpt4 key购买 nike

使用 @Version 注释进行乐观锁定时,更新现有记录时出现问题。

使用此注释方法创建一个表格(例如:“X”):

@Id()  @GeneratedValue(strategy = GenerationType.SEQUENCE)   
@Column(name="calcid")
private int calcId;
@Version @Column(name="version")
protected Integer version;

使用此方法(pp 是单例持久性提供程序):

获取记录:

Session session = [my persistency provider singleton].openSession();
session.beginTransaction();
List<X> xx = session.createQuery("from x",X.class).getResultList();
pp.closeSession();
return xx

从 xx-list 中更改一条记录 x 并将其(且仅此一条)放入列表中,发送到合并例程(不要对列表感到困惑 - 其中只有一个记录 - 已更改的记录 - 在其中,但这样我就准备合并多个记录):

合并相同记录

  Session session = [my persistency provider singleton].openSession();
session.beginTransaction();
xx.forEach(x -> { session.merge(x);});
try {
session.getTransaction().commit();
} catch (OptimisticLockException e) {
pp.closeSession();
throw e;
}
pp.closeSession();

虽然我可以在合并之前检查 @Id 并看到它与最初获取的记录相同,但结果是具有新 id 的新记录。

如果我只是删除版本注释(和版本字段),合并将按预期运行(与上面的代码完全相同,只是没有 @Version 和版本列),更新现有记录。

请注意,尽管问题似乎与乐观锁定方法中涉及的 @Version'ing 有关,但在上面的示例中,仅涉及一个 session 。

似乎仅 @version 就使 Hibernate 将原始实例视为新实例(即使 Id 相同),因此使用新 id 创建一个新实例。

Hibernate 新手,请 TIA 寻求帮助!

使用 MariaDB (FKA MySQL) 版本 10。Hibernate 5 和此 cfg:

    <?xml version="1.0" encoding="UTF-8"?>

<!-- <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 5.3//EN" "http://www.hibernate.org/dtd/hibernate-configuration-5.3.dtd"> -->

<!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd" PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN">
-<hibernate-configuration>
-<session-factory>
<!-- <property name="hbm2ddl.auto">update</property> -->
<property name="hbm2ddl.auto">update</property>
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">xxx</property>
<property name="connection.password"/>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.show_sql">false</property>
<mapping class="niels.test.Test"/>
</session-factory>
</hibernate-configuration>

致以诚挚的问候

最佳答案

请参阅以下文章了解更多信息

https://vladmihalcea.com/jpa-entity-version-property-hibernate/

关于java - Hibernate 版本控制/乐观锁定本身是否会使实例变脏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58614327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com