2010-01-21 6 views
7

Dans mon application Web, j'ai une zone de texte dont le contenu rempli par l'utilisateur est finalement conservé dans la base de données avec Hibernate. J'ai rencontré un problème qui lorsque la saisie de l'utilisateur est au-delà d'une certaine longueur, la persistance échoue. Existe-t-il un moyen d'indiquer via Hibernate Annotations ou dans la configuration que ce champ particulier devrait supporter des chaînes plus longues, et que le type de colonne de base de données devrait refléter cela?Problème persistant des longues chaînes avec Hibernate

est ici l'exception que je reçois: paramètre

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

pourquoi dites-vous que cela échoue? Est-ce qu'il tronque la chaîne silencieusement sur le backend ou obtenez-vous un message d'erreur? Si vous dites à hibernate qu'il s'agit d'un type de chaîne, il essaiera de tout sauvegarder. –

+0

Le contenu de l'utilisateur est défini dans un objet String. Une exception est levée pendant la persistance. – lupefiasco

+0

pourriez-vous mettre l'exception dans votre message? :) et peut-être l'extrait de votre cartographie actuelle. –

Répondre

20

Vous pouvez utiliser la longueur sur l'annotation, comme ceci:

@Column(length=1000) 

ou vous pouvez changer le type de colonne à quelque chose comme texte si votre base de données le prend en charge, comme ceci:

@Column(columnDefinition="text") 

Si vous utilisez la mise à jour hbm2ddl et la colonne sera créée pour utiliser ce type à la place (spécifique à la base de données).

+2

juste pour compléter, ici la longueur nécessaire pour être un int, et donc @Column (longueur = 1000) – Thomas

+1

Pour notre projet, nous aimons que la base de données psql utilise le type VARCHAR pour certaines colonnes sans une taille spécifiée. Pour cela nous utilisons: @Column (columnDefinition = "VARCHAR") – mahler

+0

D'autant plus que dans "PostgreSQL" "varchar" est le même que "texte". http://stackoverflow.com/questions/4848964/postgresql-difference-between-text-and-varchar-character-varying – tgharold

0

ok c'est effectivement une erreur de DB.

Data too long for column 'introText' 

Vérifiez la colonne introText dans votre base de données et il s'agit probablement d'un varchar dont la taille est limitée. Vous devrez changer le type de stockage en quelque chose de plus grand pour ne pas tronquer votre texte.

Si vous pensez que ce n'est pas le cas, vous devrez montrer votre mapping et votre schéma.

5

J'ai eu un problème similaire que je résolu en affectant la mise en veille prolongée de type « texte » à la propriété:

@Type(type="text") 
Questions connexes