【问题标题】:can Locale object be stored in database with hibernate语言环境对象可以用休眠存储在数据库中吗
【发布时间】:2014-10-24 20:18:50
【问题描述】:

我有以下实体:

@RooEntity
Class X {
    @NotNull
    private Locale locale;
}

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

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

【问题讨论】:

    标签: java database hibernate spring-roo


    【解决方案1】:

    你也可以使用属性转换器

    @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;
        }
      }
    

    【讨论】:

    • 这是一种非常转换的方式。我看到了它的力量。谢谢
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      就这么简单:

      @RooEntity
      Class X {
          @NotNull
          @Basic
          private String localeString;
      
      
      
          ....
         public Locale getLocaleFromString() {
              return new Locale(localeString);
         }
      }
      

      【讨论】:

      • 这是一个非常实用的功能。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多