Как увеличить длину строки в MySQL при отображении с использованием JPA - PullRequest
8 голосов
/ 22 сентября 2011

У меня проблемы с JPA.Я был бы очень благодарен, если бы кто-то мог предоставить решение.С JPA (я использую MySQL DB), допустим, у меня есть класс, отображаемый следующим образом:

@Entity    
class Employee{    
   int id;    
   String employeeName;    
 //getters and setters...   
 }

при отображении в таблицу, я вижу, что String отображается с varchar(255) в Mysql.Однако, скажем, если у меня есть сотрудник, чье имя превышает 255 символов, это показывает ошибку усечения данных.

Я знаю, что мы могли бы решить эту проблему, добавив атрибут "length" в столбец Employee следующим образом:

@column(length=1000)    
String employeeName;

Это единственный возможный способ?Я думал, что если мы просто отобразим String в Java, база данных будет динамически назначать длину.

Ответы [ 2 ]

14 голосов
/ 22 сентября 2011

при сопоставлении с таблицей, я вижу, что String сопоставляется с varchar (255) в Mysql

Это связано с тем, что длина по умолчанию VARCHAR столбцов в выражениях DDL создаетсябольшинство поставщиков JPA (включая Hibernate и EclipseLink) имеет значение 255. Указание атрибута length для аннотации @Column помогает переопределить значение, так что новое значение выбирается генератором схемы поставщика JPA.

Я думал, что если мы просто отобразим String в java, база данных будет динамически назначать длину.

Это неверное предположение.Поставщик JPA будет создавать таблицы только один раз и не будет динамически изменять длину базовой таблицы в течение всего жизненного цикла приложения, и только если вы сначала сконфигурируете поставщика для создания / обновления определений таблиц.Кроме того, по умолчанию String соответствует типу SQL VARCHAR.

Похоже, вы настроили поставщика JPA для создания таблиц по мере необходимости (после возможного удаления их) во время процесса инициализации.Если вы используете Hibernate, это делается с помощью свойства hibernate.hbm2ddl.auto, указанного в persistence.xml со значением update, create или create-drop.При использовании EclipseLink вы указали бы свойство eclipselink.ddl-generation со значением create-tables или drop-and-create-tables.

Оба эти свойства не рекомендуются для использования в производственной среде ,Идеальный подход - использовать DDL-скрипты для создания таблиц.Поскольку вы используете VARCHAR, вы должны указать подходящую длину в определении столбца, , чтобы соответствовать максимальной длине пользовательского ввода .Кроме того, поскольку вы используете VARCHAR более CHAR, ядро ​​базы данных будет гарантировать, что выделенное пространство будет зависеть от размера хранимых записей.

Если вам не нужна строка дляпо умолчанию VARCHAR mapping и вместо этого используется другое допустимое отображение, тогда вы должны использовать columnDefinition атрибут аннотации @Column.Пример использования для сопоставления Calendar с типом данных TIMESTAMPTZ SQL показан в JPA WikiBook ;вам нужно изменить это в соответствии с вашими потребностями.

7 голосов
/ 03 августа 2012

столбцы varchar поддерживают длины динамического размера (без заполнения, как с char), но вы должны указать максимальный размер столбца, если вы хотите что-то кроме 255. Различные базы данных имеют разные ограничения на размер char и varchar (обычно 8k или 65k).

Если вы хотите выйти за этот предел, вам нужно добавить аннотацию @Lob к вашей строке, чтобы она соответствовала типу столбца CLOB (при условии, что вы разрешаете JPA создавать таблицы).Столбцы CLOB / BLOB могут быть намного больше, чем varchar (опять же, точные пределы зависят от вашей БД).Но у больших объектов есть такие ограничения, как то, что они не являются первичными ключами или не используются в предложениях WHERE.

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