hbm2ddl для столбца, основанного на GenericEnumUserType - PullRequest
2 голосов
/ 01 декабря 2009

В следующем определении столбца 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

1 Ответ

2 голосов
/ 01 декабря 2009

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

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

Все, что сказано, я бы обычно рекомендовал бы:

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

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
...