可以使用hibernate将Locale对象存储在数据库中

ris*_*p89 2 java database hibernate spring-roo

我有以下实体:

@RooEntity
Class X {
    @NotNull
    private Locale locale;
}
Run Code Online (Sandbox Code Playgroud)

是否可以在数据库中存储Locale对象的toString()表示,并且在检索时我仍然可以获取Locale对象?

我可以在这里使用@Basic注释吗?

小智 6

而且你也可以使用属性转换器

@RooEntity
Class X {
@Column(name = "locale")
    @Convert(converter = LocaleConverter.class)
    private Locale locale;
...
}
Run Code Online (Sandbox Code Playgroud)

转换器:

 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;
    }
  }
Run Code Online (Sandbox Code Playgroud)


Ale*_*der 5

是的,无需任何额外配置即可存储。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

}
Run Code Online (Sandbox Code Playgroud)

SQL(在 MySQL 上测试):

create table user
(
  id                bigint auto_increment primary key,
  locale            varchar(5)   not null
);
Run Code Online (Sandbox Code Playgroud)

结果:以 Java 语言环境格式存储的数据:“en_US”


WeM*_*are 4

您可以将 localeString(或语言)保存到数据库,并在获取实体后重新创建 Locale 对象。

就像这样简单:

@RooEntity
Class X {
    @NotNull
    @Basic
    private String localeString;



    ....
   public Locale getLocaleFromString() {
        return new Locale(localeString);
   }
}
Run Code Online (Sandbox Code Playgroud)