2011-10-21 23 views
6

Mam prosty EntityBean z adnotacją @Lob. Jeśli usunę tę adnotację, nie otrzymam żadnych błędów w JBossAS 6.0.0.Final i MySQL5. Ale jeśli dodam do tego komentarz z @Lob (ponieważ w moim przypadku zawiera około 100 do 5000 znaków), otrzymam błędy w moim środowisku testowym, jeśli utrwalę encję.JBoss6 JPA: Entity with @Lob skutkuje genericJDBCException

  • bez @Lob: mt są odwzorowywane na VARCHAR
  • z @Lob: mt jest odwzorowywany longtext (to jest to, co chcę, ale pojawiają się błędy)

To moja jednostka:

@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 

Błąd występuje tutaj:

... 
Caused by: org.hibernate.exception.GenericJDBCException: could not insert 
    [my.Description] 
... 
Caused by: java.sql.SQLException: Connection is not associated with a managed 
    connec[email protected]3e4dd 
... 

Naprawdę nie wiem, dlaczego dostaję ten (powtarzalny) błąd. Środowisko wydaje się być w porządku, wiele innych testów jest zdanych i działa nawet bez adnotacji @Lob.

To pytanie jest związane z JPA: how do I persist a String into a database field, type MYSQL Text, gdzie przyjęto odpowiedź @Lob dla JPA/MySQL.

Aktualizacja 1 Powyższy błąd zależy od systemu operacyjnego. Na maszynie W7 nie mam problemów z @Lob, z OSX Lion zawsze błąd. Spróbuję zaktualizować MySQL i sterownik.

Aktualizacja 2 Proponowane obejście Kimi z @Column(columnDefinition = "longtext") działa dobrze, nawet na OSX. W obu przypadkach MySQL tworzy tę samą kolumnę: LONGTEXT.

Aktualizacja 3 Zaktualizowałem MySQL do mysql-5.5.17-osx10.6-x86_64 oraz złącze do mysql-connector-java-5.1.18. Wciąż ten sam błąd.

+2

Co robi twój opis tabela wygląda? Jeśli mt jest varcharem w twojej bazie danych, to dlaczego miałbyś chcieć zmapować go na Lob? –

+0

Czy MySQL5 obsługuje LONGTEXT jako poprawną wartość do tworzenia identyfikatora? Nie jestem pewien, jak DB powinien to zrobić ... zwiększyć wartość tekstową? –

+0

@PedroKowalski mt nie jest używany jako identyfikator. Pole identyfikatora to. Tak to początkowo czytam, ale jest to kiepskie formatowanie kodu. –

Odpowiedz

4

Nie trzeba trzeba do adnotowania właściwości String z @Lob. Po prostu ustaw długość kolumny za pomocą @Column(length = 10000).

EDIT:

Ponadto zawsze można ustawić długość do swojej maksymalnej wartości określonej bazy danych, a także określić typ kolumny z ustawieniem columndefinition aby cokolwiek odpowiada Twoim potrzebom.

Na przykład, jeśli używasz MySQL 5.0.3 lub nowszej, maksymalna ilość danych, które mogą być przechowywane w każdego typu danych jest następujący:

  • VARCHAR: 65535 bajtów (~ 64kb, 21844 UTF-8 znaków)
  • tekstowych: 65.535 bajtów (~ 64kb, 21,844 UTF-8 znaków)
  • MEDIUMTEXT: 16,777,215 bajtów (~ 16 MB ~ 5,5 milionów UTF-8 znaków)
  • longtext: 4 294 967 295 bajtów (~ 4 GB, ~ 1,4 miliarda znaków zakodowanych w UTF-8).

Jak rozumiem, @Lob po prostu ustawia typ i długość kolumny w zależności od bazowej bazy danych.

+0

Co się stanie, jeśli ciąg ma z kilku powodów więcej niż 10000 znaków? Zobacz, http://stackoverflow.com/questions/3868096 – Thor

+2

Zawsze możesz ustawić długość na maksymalną wartość dla Twojej bazy danych, a także zdefiniować typ kolumny z ustawieniem 'columndefinition' zgodnie ze swoimi potrzebami. Na przykład, jeśli używasz MySQL w wersji 5.0.3 lub nowszej, maksymalna długość kodu VARCHAR kodowanego w UTF-8 wynosi 21 844 znaki (65 535 bajtów), czyli tyle samo, co limit typu TEXT. MEDIUMTEXT może pomieścić 16 777 215 bajtów (~ 16 MB, ~ 5,5 miliona znaków) i LONGTEXT 4 294 967 295 bajtów (~ 4 GB, ~ 1,4 miliarda znaków). Jak to rozumiem, '@ Lob' po prostu ustawia typ i długość kolumny na niektóre wartości specyficzne dla bazy danych. – Kimi

+0

Więc jeśli przenośność nie jest problemem, poszedłbym z tym. – Kimi

2

Innym sposobem, który pracował dla mnie jest zaktualizowanie konfiguracji launch JBoss z

-Dhibernate.jdbc.use_streams_for_binary=true 

biegnę jBoss6 z MySQL5