2011-10-21 16 views
6

Ho un EntityBean semplice con un'annotazione @Lob. Se elimino questa annotazione non ottengo errori su JBossAS 6.0.0.Final e MySQL5. Ma se lo annoto con @Lob (perché mt contiene da 100 a 5000 caratteri nel mio caso) ottengo errori nel mio ambiente di test se continuo l'entità.JBoss6 JPA: entità con @Lob genera GenericJDBCException

  • senza @Lob: mt è mappato a VARCHAR
  • con @Lob: mt è mappato a LONGTEXT (questo è quello che voglio, ma ho errori)

Questa mia entità:

@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 

L'errore è qui:

... 
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 
... 

Non so davvero perché ottengo questo errore (riproducibile). L'ambiente sembra essere ok, molti altri test sono passati e funziona anche senza l'annotazione @Lob.

Questa domanda è relativa a JPA: how do I persist a String into a database field, type MYSQL Text, dove l'utilizzo di @Lob per JPA/MySQL è la risposta accettata.

Aggiornamento 1 L'errore precedente è specifico del sistema operativo. Su una macchina W7 non ho problemi con @Lob, con OSX Lion sempre l'errore. Cercherò di aggiornare MySQL e il driver.

Aggiornamento 2 La soluzione proposta da Kimi con @Column(columnDefinition = "longtext") funziona correttamente, anche su OSX. In entrambi i casi, MySQL crea la stessa colonna: LONGTEXT.

Aggiornamento 3 Ho aggiornato MySQL a mysql-5.5.17-osx10.6-x86_64 e il connettore a mysql-connector-java-5.1.18. Ancora lo stesso errore.

+2

cosa fa il tuo tavolo descrizione assomiglia? Se mt è un varchar nel tuo database allora perché vorresti provare a mapparlo ad un Lob? –

+0

MySQL5 supporta LONGTEXT come valore corretto per la creazione di un identificatore? Non sono sicuro di come dovrebbe fare il DB ... incrementare il valore del testo? –

+0

@PedroKowalski mt non viene utilizzato come identificatore. Il campo ID è. Questo è come l'ho letto all'inizio, ma è solo una cattiva formattazione del codice. –

risposta

4

Non è necessario per annotare una proprietà String con @Lob. Basta impostare la lunghezza della colonna con @Column(length = 10000).

EDIT:

Inoltre, è sempre possibile impostare la lunghezza allo specifico valore massimo di database, nonché definire il tipo di colonna con l'impostazione columndefinition a qualsiasi adatta alle vostre esigenze.

Ad esempio, se si sta utilizzando MySQL 5.0.3 o successivo, la quantità massima di dati che possono essere memorizzati in ogni tipo di dati è la seguente:

  • VARCHAR: 65.535 byte (~ 64Kb, 21.844 caratteri UTF-8 codificati)
  • TESTO: 65.535 byte (~ 64 KB, 21.844 caratteri UTF-8 codificati)
  • MEDIUMTEXT: 16.777.215 byte (~ 16Mb, ~ 5,5 milioni di caratteri UTF-8 codificati)
  • LONGTEXT: 4.294.967.295 byte (~ 4 GB, ~ 1,4 miliardi di caratteri codificati UTF-8).

Come ho capito, @Lob imposta solo il tipo di colonna e la lunghezza a seconda del database sottostante.

+0

Cosa succede se la stringa ha per qualche motivo più di 10000 caratteri? Per favore vedi, http://stackoverflow.com/questions/3868096 – Thor

+2

Bene, puoi sempre impostare la lunghezza sul valore massimo specifico del tuo database, così come definire il tipo di colonna con l'impostazione 'columndefinition' a seconda delle tue esigenze. Ad esempio, se si utilizza MySQL 5.0.3 o versione successiva, la lunghezza massima per un VARCHAR codificato in UTF-8 è di 21.844 caratteri (65.535 byte), che è uguale al limite del tipo di TESTO. MEDIUMTEXT può contenere 16.777.215 byte (~ 16 Mb, ~ 5,5 milioni di caratteri) e LONGTEXT 4,294,967,295 byte (~ 4 GB, ~ 1,4 miliardi di caratteri). A quanto ho capito, '@ Lob' imposta semplicemente il tipo e la lunghezza della colonna in alcuni valori specifici del database. – Kimi

+0

Quindi, se la portabilità non è un problema, andrei con questo. – Kimi

2

Un altro modo che ha funzionato per me è quello di aggiornare la configurazione lancio di JBoss con

-Dhibernate.jdbc.use_streams_for_binary=true 

Io corro jBoss6 con MySQL5

Problemi correlati