hbm2ddl для столбца, основанного на GenericEnumUserType

StackOverflow https://stackoverflow.com/questions/1826272

  •  22-07-2019
  •  | 
  •  

Вопрос

В следующем определении столбца JPA генерируется " целое число " тип данных по умолчанию во всех базах данных (например, h2, mysql, postgres)

@Column(name = "type", nullable = false)
@Type(type = "com.mycompany.hibernate.usertype.GenericEnumUserType", parameters = {
        @Parameter(name = "enumClass", value = "com.mycompany.model.DegreeType"),
        @Parameter(name = "identifierMethod", value = "toInt"),
        @Parameter(name = "valueOfMethod", value = "fromInt") })
@NotNull
private DegreeType type;

Я хотел бы использовать минимальное хранилище для этого поля и, следовательно, предпочел бы использовать параметр columnDefinition для генерации schema2ddl. Но похоже, что tinyint не поддерживается в postgres, но поддерживается в других базах данных, упомянутых выше.

Можно ли создавать разные файлы SQL в зависимости от типа базы данных. 1. Каков наилучший подход для достижения этой цели? 2. Какой тип данных (с минимальным объемом памяти) лучше всего подходит для этой цели? Это будет smallint

Это было полезно?

Решение

Поскольку вы используете пользовательский тип (почему?), определения базовых столбцов будут генерироваться на основе результата метода sqlTypes () вашего типа. Фактический тип столбца SQL будет получен из соответствующего Dialect .

Таким образом, если sqlTypes () должен вернуть new int [] {Types.TINYINT} , диалект PostgresQL отобразит его в int2 и H2 / MySQL для tinyint .

С учетом всего вышесказанного я бы обычно рекомендовал:

<Ол>
  • Используйте встроенную поддержку перечислений через @Enumerated аннотацию.
  • Сохраняйте значение перечисления как строка , а не как целое число. Использование последнего экономит некоторое пространство, но создает огромную потенциальную проблему: через 3 месяца (года) кто-то меняет код, вставляя другую константу перечисления в середину вашего типа, и внезапно все ваши данные становятся недействительными. Дисковое пространство дешево; иметь дело с такими вопросами не так.

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top