我们当前使用 Hibernate 5.6,但正在尝试升级到 Hibernate 6.1。在一个实体中,我们具有以下属性:
@Type(type = "text")
private String someText;
但在 Hibernate 6.1 中,
type
注释中的 @Type
字段被删除。现在 @Type
注释定义如下:
@java.lang.annotation.Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface Type {
/**
* The implementation class which implements {@link UserType}.
*/
Class<? extends UserType<?>> value();
/**
* Parameters to be injected into the custom type after it is
* instantiated. The {@link UserType} implementation must implement
* {@link org.hibernate.usertype.ParameterizedType} to receive the
* parameters.
*/
Parameter[] parameters() default {};
}
问题:Hibernate 6.1 中的
@Type(type = "text")
相当于什么?
基于 Hibernate 5.0 文档 - 对于
text
BasicTypeRegistry 键对应于 LONGVARCHAR
Jdbc 类型。
在 Hibernate 6.1.5 文档中提供了使用
@JdbcTypeCode
注释的选项:
@JdbcTypeCode(Types.LONGVARCHAR)
private String text;
Georgii Lvov 的回答非常好。我想补充一点,还有一个替代方案:
@JdbcType(LongVarcharJdbcType.class)
几乎与
@JdbcTypeCode(Types.LONGVARCHAR)
同义。我想,你使用哪一个有点品味问题。
我不知道在 Hibernate 6+ 中使用
@Type
的正确语法,但作为解决方法,您可以尝试使用 @Column
注释:
@Column(columnDefinition="TEXT")
private String someText;
UserTypeLegacyBridge
提供了一种使用遗留命名类型的方法:
@Type(value = UserTypeLegacyBridge.class, parameters = @Parameter(name = UserTypeLegacyBridge.TYPE_NAME_PARAM_KEY, value = "text"))
private String someText;