扩展UserVersionType时如何实现Seed和Next
How to implement Seed and Next when extending UserVersionType
我正在尝试实现基于字符串的 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();
}
}
我尝试将简单的代码添加到 return 一个始终相同的字符串和可能会更改版本号的代码。我总是在更新时遇到错误。当我向这些 UserVersionType 方法添加几乎所有内容时查看休眠控制台输出休眠停止执行 select 然后更新但总是直接进入新的插入查询因此失败主键仍然存在。
显然我误解了 seed 和 next 应该做什么,但我找不到任何有用的文档?
谁能告诉我更多关于如何使用它们的信息?
Seed
:
生成初始版本。
参数:
session - 发起此请求的会话。可以为空;目前,这仅在启动期间尝试确定实体的 "unsaved value" 时发生。
Returns:
类型的一个实例
@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
next
:
增加版本。
参数:
session - 发起此请求的会话。
当前 - 当前版本
Returns:
类型的一个实例
public Object next(Object current,
SessionImplementor session) {
return ( (UserVersionType) userType ).next( current, session );
}
来自文档:
"UPDATE statements, by default, do not effect the version or the timestamp attribute values for the affected entities. However, you can force Hibernate to set the version or timestamp attribute values through the use of a versioned update. This is achieved by adding the VERSIONED keyword after the UPDATE keyword. Note, however, that this is a Hibernate specific feature and will not work in a portable manner. Custom version types, org.hibernate.usertype.UserVersionType, are not allowed in conjunction with a update versioned statement."
其他文档:
专用版本号
乐观锁定的版本号机制通过@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_INCREMENTcheck 的文档。
数据库生成的版本号
如果版本号是由数据库生成的,比如触发器,使用注解@org.hibernate.annotations.Generated(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|."
/>
这是我从文档中找到的所有内容,可以帮助您理解为什么以及如何使用这些方法。由于我对问题的误解,将不相关的部分反馈给我,以将其删除。
我正在尝试实现基于字符串的 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();
}
}
我尝试将简单的代码添加到 return 一个始终相同的字符串和可能会更改版本号的代码。我总是在更新时遇到错误。当我向这些 UserVersionType 方法添加几乎所有内容时查看休眠控制台输出休眠停止执行 select 然后更新但总是直接进入新的插入查询因此失败主键仍然存在。
显然我误解了 seed 和 next 应该做什么,但我找不到任何有用的文档?
谁能告诉我更多关于如何使用它们的信息?
Seed
:
生成初始版本。 参数: session - 发起此请求的会话。可以为空;目前,这仅在启动期间尝试确定实体的 "unsaved value" 时发生。 Returns: 类型的一个实例
@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
next
:
增加版本。 参数: session - 发起此请求的会话。 当前 - 当前版本 Returns: 类型的一个实例
public Object next(Object current,
SessionImplementor session) {
return ( (UserVersionType) userType ).next( current, session );
}
来自文档:
"UPDATE statements, by default, do not effect the version or the timestamp attribute values for the affected entities. However, you can force Hibernate to set the version or timestamp attribute values through the use of a versioned update. This is achieved by adding the VERSIONED keyword after the UPDATE keyword. Note, however, that this is a Hibernate specific feature and will not work in a portable manner. Custom version types, org.hibernate.usertype.UserVersionType, are not allowed in conjunction with a update versioned statement."
其他文档:
专用版本号 乐观锁定的版本号机制通过@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_INCREMENTcheck 的文档。
数据库生成的版本号 如果版本号是由数据库生成的,比如触发器,使用注解@org.hibernate.annotations.Generated(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|."
/>
这是我从文档中找到的所有内容,可以帮助您理解为什么以及如何使用这些方法。由于我对问题的误解,将不相关的部分反馈给我,以将其删除。