【发布时间】:2014-10-24 20:18:50
【问题描述】:
我有以下实体:
@RooEntity
Class X {
@NotNull
private Locale locale;
}
是否可以将 Locale 对象的 toString() 表示形式存储在数据库中,并且在检索时我仍然可以获得 Locale 对象?
我可以在这里使用@Basic 注解吗?
【问题讨论】:
标签: java database hibernate spring-roo
我有以下实体:
@RooEntity
Class X {
@NotNull
private Locale locale;
}
是否可以将 Locale 对象的 toString() 表示形式存储在数据库中,并且在检索时我仍然可以获得 Locale 对象?
我可以在这里使用@Basic 注解吗?
【问题讨论】:
标签: java database hibernate spring-roo
你也可以使用属性转换器
@RooEntity
Class X {
@Column(name = "locale")
@Convert(converter = LocaleConverter.class)
private Locale locale;
...
}
转换器:
public class LocaleConverter implements AttributeConverter<Locale, String> {
@Override
public String convertToDatabaseColumn(Locale locale) {
if (locale != null) {
return locale.toLanguageTag();
}
return null;
}
@Override
public Locale convertToEntityAttribute(String languageTag) {
if (languageTag != null && !languageTag.isEmpty()) {
return Locale.forLanguageTag(languageTag);
}
return null;
}
}
【讨论】:
是的,无需任何额外配置即可存储。 Hibernate 有内置的基本类型LocalType,可以将 java.util.Locale 转换为 jdbc VARCHAR 类型,反之亦然。
例子:
...
import java.util.Locale;
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Basic(optional = false)
private Locale locale;
// getters and setters
}
SQL(在 MySQL 上测试):
create table user
(
id bigint auto_increment primary key,
locale varchar(5) not null
);
结果:以 Java 语言环境格式存储的数据:“en_US”
【讨论】:
您可以将 localeString(或语言)保存到数据库,并在获取实体后重新创建 Locale 对象。
就这么简单:
@RooEntity
Class X {
@NotNull
@Basic
private String localeString;
....
public Locale getLocaleFromString() {
return new Locale(localeString);
}
}
【讨论】: