JPA + Hibernate без всякой необходимости использует длинный текст mysql? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть сущность, определенная так ...

@Entity
data class MyAuthEntity(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long? = null,

        @Column(nullable = false, length = 500)
        @Size(max = 500)
        var token: String = "",

        @Column(nullable = false, length = 250)
        @Size(max = 250)
        var name: String = "",

...

)

По какой-то причине создается таблица mysql, определенная так ...

CREATE TABLE `my_auth_entity` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `token` longtext NOT NULL,
  `name` varchar(250) NOT NULL,

...

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

" longtext "кажется крайне неподходящим типом столбца всего для 500 символов. Есть ли веская причина, по которой он это сделал. Конечно, даже использование «текста» имело бы больше смысла.

Как правильно заставить его использовать вместо этого varchar? Я знаю, что могу определить это так ...

@Column(nullable = false, length = 500, columnDefinition = "VARCHAR(500)")

Не похоже, что я должен быть именно такой c реализации.

1 Ответ

1 голос
/ 18 июня 2020

Не похоже, что я должен использовать эту реализацию c, хотя.

Чтобы избежать необходимости переопределения columnDefinition в определенных c столбцах, вам нужно будет настроить диалект Hibernate для MySQL.

Если вы посмотрите на MySQLDialect, вы увидите следующий метод управления разрешением типа символов:

protected void registerVarcharTypes() {
        registerColumnType( Types.VARCHAR, "longtext" );
//      registerColumnType( Types.VARCHAR, 16777215, "mediumtext" );
//      registerColumnType( Types.VARCHAR, 65535, "text" );
        registerColumnType( Types.VARCHAR, 255, "varchar($l)" );
        registerColumnType( Types.LONGVARCHAR, "longtext" );
    }

, в котором varchar максимальная емкость установлена ​​на 255.

Вам нужно будет переопределить этот метод на настраиваемом диалекте (убедитесь, что он расширен от соответствующего подкласса MySQLXxxDialect, в зависимости от того, какую версию MySQL вы используете), и указать Hibernate на использование ваш собственный диалект через свойство hibernate.dialect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...