2010-01-21 21 views
7

Nella mia applicazione Web, ho un'area di testo il cui contenuto caricato dall'utente è in definitiva persistente nel db con Hibernate. Ho riscontrato un problema che quando l'input dell'utente supera una certa lunghezza, la persistenza non riesce. C'è un modo per indicare tramite Hibernate Annotations o nella configurazione che questo particolare campo dovrebbe supportare stringhe più lunghe e che il tipo di colonna del database dovrebbe riflettere questo?Problema delle stringhe lunghe persistenti con Hibernate

Ecco l'eccezione che sto ricevendo:

Caused by: java.sql.BatchUpdateException: Data truncation: Data too long for column 'introText' at row 1 
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2007) 
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1443) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
    ... 41 more 
+0

Perché dici non riesce? tronca la stringa in modo silenzioso sul back-end o ricevi un messaggio di errore? Se dici di essere in ibernazione che si tratta di un tipo di stringa, cercherà di salvare tutto. –

+0

Il contenuto dell'utente è impostato in un oggetto String. Un'eccezione viene lanciata durante la persistenza. – lupefiasco

+0

potresti inserire l'eccezione nel tuo messaggio? :) e forse lo snippet dalla mappatura corrente. –

risposta

20

è possibile utilizzare il parametro lunghezza su l'annotazione, in questo modo:

@Column(length=1000) 

o si potrebbe cambiare il tipo di colonna a qualcosa di simile testo se il database supporta, in questo modo:

@Column(columnDefinition="text") 

Se si utilizza aggiornamento hbm2ddl e la colonna verrà creata per utilizzare quel tipo invece (specifico del database).

+2

solo per completare, qui la lunghezza necessaria per essere un int, e quindi @Column (lunghezza = 1000) – Thomas

+1

Per il nostro progetto ci piace che il database psql utilizzi il tipo VARCHAR per alcune colonne senza una dimensione specificata. Per questo usiamo: @Column (columnDefinition = "VARCHAR") – mahler

+0

Soprattutto perché in PostgreSQL "varchar" è lo stesso di "testo". http://stackoverflow.com/questions/4848964/postgresql-difference-between-text-and-varchar-character-varying – tgharold

0

ok che è un errore DB in realtà.

Data too long for column 'introText' 

controllo colonna introtext nel vostro DB ed è probabilmente un varchar che è solo una dimensione limitata. Dovrai cambiare il tipo di archiviazione in qualcosa di più grande in modo che non troncerà il tuo testo.

Se pensi che non sia, dovrai mostrare la tua mappatura e schema.

5

Ho avuto un problema simile che ho risolto assegnando il tipo di Hibernate "testo" alla proprietà:

@Type(type="text") 
Problemi correlati