JBoss6 JPA: объект с @Lob приводит к GenericJDBCException - PullRequest
6 голосов
/ 21 октября 2011

У меня есть простой EntityBean с аннотацией @Lob. Если я удаляю эту аннотацию, я не получаю ошибок на JBossAS 6.0.0.Final и MySQL5. Но если я аннотирую его с помощью @Lob (поскольку mt содержит от 100 до 5000 символов в моем случае), я получаю ошибки в своей среде тестирования, если я сохраняю сущность.

  • без @Lob: mt сопоставлено с VARCHAR
  • с @Lob: mt сопоставлен с LONGTEXT (это то, что я хочу, но я получаю ошибки)

Это моя сущность:

@Entity
@Table(name = "Description")
public class Description implements Serializable
{ 
  public static final long serialVersionUID=1;

  @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
  private long id;  

  @Lob
  private String mt;
}  // ... getter/setter

Ошибка здесь:

...
Caused by: org.hibernate.exception.GenericJDBCException: could not insert
   [my.Description]
...
Caused by: java.sql.SQLException: Connection is not associated with a managed
     connection.org.jboss.resource.adapter.jdbc.jdk6.WrappedConnectionJDK6@3e4dd
...

Я действительно не знаю, почему я получаю эту (воспроизводимую) ошибку. Среда вроде бы в порядке, многие другие тесты пройдены и даже работают без аннотации @Lob.

Этот вопрос относится к JPA: как мне сохранить строку в поле базы данных, введите MYSQL Text , где использование @Lob для JPA / MySQL является принятым ответом.

Обновление 1 Вышеприведенная ошибка зависит от ОС. На машине W7 у меня нет проблем с @Lob, с OSX Lion всегда ошибка. Я постараюсь обновить MySQL и драйвер.

Обновление 2 Предложенный обходной путь Кими с @Column(columnDefinition = "longtext") отлично работает, даже на OSX. В обоих случаях MySQL создает один и тот же столбец: LONGTEXT.

Обновление 3 Я обновил MySQL до mysql-5.5.17-osx10.6-x86_64 и соединитель до mysql-connector-java-5.1.18. Все та же ошибка.

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

Нет необходимости для аннотирования свойства String с помощью @Lob. Просто установите длину столбца с помощью @Column(length = 10000).

EDIT:

Кроме того, вы всегда можете установить длину в соответствии с максимальным значением вашей базы данных, а также определить тип столбца с параметром columndefinition, который соответствует вашим потребностям.

Например, если вы используете MySQL 5.0.3 или более позднюю версию, максимальный объем данных, которые могут храниться в каждом типе данных, будет следующим:

  • VARCHAR: 65 535 байт (~ 64 КБ, 21 844 символов в кодировке UTF-8)
  • ТЕКСТ: 65 535 байт (~ 64 КБ, 21 844 символов в кодировке UTF-8)
  • MEDIUMTEXT: 16 777 215 байт (~ 16 МБ, ~ 5,5 млн. Символов в кодировке UTF-8)
  • LONGTEXT: 4 294 967 295 байт (~ 4 ГБ, ~ 1,4 млрд. Кодированных символов UTF-8).

Насколько я понимаю, @Lob просто устанавливает тип и длину столбца в зависимости от базовой базы данных.

2 голосов
/ 26 сентября 2012

Другой способ, который мне помог, - обновить запустить конфигурацию jBoss с помощью

-Dhibernate.jdbc.use_streams_for_binary=true

Я использую jBoss6 с MySQL5

...