gpt4 book ai didi

java - 扩展 UserVersionType 时如何实现 Seed 和 Next

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

我正在尝试实现一个基于字符串的 UserVersionType。我已经找到足够的例子来理解如何在一定程度上使用 UserType 方法。我找不到任何东西可以准确地告诉我如何使用 next() 和 seed()。

所以我有这样的东西

public class StringVersionType implements UserType, UserVersionType {
...

public int compare(Object o1, Object o2) {
String a = (String) o1;
String b = (String) o2;

return a.compareTo(b);
}

public Object next(Object arg0, SharedSessionContractImplementor arg1)
{

return "DUMMY SEED"; // + LocalTime.now().toString();
}

public Object seed(SharedSessionContractImplementor session){
return "DUMMY SEED"; // LocalTime.now().toString();
}

}

我尝试添加简单的代码来返回始终相同的字符串以及可能更改版本号的代码。我总是在更新时遇到错误。当我向这些 UserVersionType 方法添加几乎任何内容时,查看 hibernate 控制台输出,hibernate 停止执行选择,然后更新,但总是直接进入新的插入查询,因此主键上的失败仍然存在。

显然我误解了seed和next应该做什么,但我找不到任何有用的文档?

谁能告诉我更多关于如何使用它们的信息吗?

最佳答案

种子:

生成初始版本。参数:session - 发起此请求的 session 。可能为空;目前,这只在启动期间尝试确定实体的“未保存值”时发生。返回:该类型的实例

@Override
public Object
seed(SharedSessionContractImplementor session)
{
return ( (UserVersionType) userType ).seed(
session );
}

For properties mapped as either version or timestamp, the insert statement gives you two options. You can either specify the property in the properties_list, in which case its value is taken from the corresponding select expressions, or omit it from the properties_list, in which case the seed value defined by the org.hibernate.type.VersionType is used

下一个:

增加版本。参数:session - 发起此请求的 session 。当前 - 当前版本返回:该类型的实例

public Object next(Object current, 
SessionImplementor session) {
return ( (UserVersionType) userType ).next( current, session );
}

来自文档:

“默认情况下,UPDATE 语句不会影响受影响实体的版本或时间戳属性值。但是,您可以通过使用版本化更新强制 Hibernate 设置版本或时间戳属性值。这是通过在 UPDATE 关键字后添加 VERSIONED 关键字来实现的。但是请注意,这是 Hibernate 特定功能,不能以可移植的方式工作。自定义版本类型 org.hibernate.usertype.UserVersionType 不允许与更新版本化语句结合使用”

其他文档:

专用版本号乐观锁的版本号机制是通过@Version注解提供的。

@Version 注释

  @Entity
public class Flight implements Serializable {
...
@Version
@Column(name="OPTLOCK")
public Integer getVersion() { ... }
}

这里,版本属性映射到 OPTLOCK 列,实体管理器使用它来检测冲突的更新,并防止丢失会被最后提交获胜策略覆盖的更新。

版本列可以是任何类型,只要您定义并实现适当的 UserVersionType。

禁止您的应用程序更改 Hibernate 设置的版本号。要人为地增加版本号,请参阅 Hibernate Entity Manager 引用文档中的属性 LockModeType.OPTIMISTIC_FORCE_INCREMENT 或 LockModeType.PESSIMISTIC_FORCE_INCRMENTcheck 的文档。

数据库生成的版本号如果版本号是由数据库生成的,比如触发器,则使用注解@org.hibernate.annotations.Generate(GenerationTime.ALWAYS)。

在 hbm.xml 中声明版本属性

 <version
column="version_column"
name="propertyName"
type="typename"
access="field|property|ClassName"
unsaved-value="null|negative|undefined"
generated="never|always"
insert="true|false"
node="element-name|@attribute-
name|element/@attribute|."
/>

这是我从文档中可以找到的所有内容,可以帮助您理解为什么以及如何使用这些方法。由于我对问题的误解,请反馈有关不相关部分的反馈,以将其删除。

关于java - 扩展 UserVersionType 时如何实现 Seed 和 Next,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54373169/

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