61 votes

JPA, Blob Mysql retourne trop de données

J'ai quelques champs byte[] dans mes entités, par exemple :

@Entity
public class ServicePicture implements Serializable {
    private static final long serialVersionUID = 2877629751219730559L;
    // attributs seam-gen (vous devriez probablement les éditer)
    @Id
    @GeneratedValue
    private Long id;
    private String description;

    @Lob
    @Basic(fetch = FetchType.LAZY)
    private byte[] picture;

Sur mon schéma de base de données, le champ est défini comme BLOB donc cela devrait fonctionner. Quoi qu'il en soit : Chaque fois que j'essaie d'insérer une image ou un PDF - rien de plus grand que 1mb, je ne reçois que ceci

16:52:27,327 WARN  [JDBCExceptionReporter] SQL Error: 0, SQLState: 22001
16:52:27,327 ERROR [JDBCExceptionReporter] Data truncation: Data too long for column 'picture' at row 1
16:52:27,328 ERROR [STDERR] javax.persistence.PersistenceException: org.hibernate.exception.DataException: could not insert: [de.ac.dmg.productfinder.entity.ServicePicture]
16:52:27,328 ERROR [STDERR]     at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:629)
16:52:27,328 ERROR [STDERR]     at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:218)
16:52:27,328 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
16:52:27,328 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
16:52:27,328 ERROR [STDERR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
16:52:27,328 ERROR [STDERR]     at java.lang.reflect.Method.invoke(Unknown Source)
16:52:27,328 ERROR [STDERR]     at org.jboss.seam.persistence.EntityManagerInvocationHandler.invoke(EntityManagerInvocationHandler.java:46)
16:52:27,328 ERROR [STDERR]     at $Proxy142.persist(Unknown Source)

J'ai vérifié mon cnf MySQL et le paramètre max_allowed est défini sur 16M - est-ce que j'ai oublié quelque chose ?

1 votes

Résolu par ce lien enricogi.blogspot.com/2008/12/blob-type-in-mysql.html - en bref - Le Blob MySQL a une taille maximale de 64 ko

129voto

Pascal Thivent Points 295221

Tout dépend du type de colonne utilisé pour la colonne picture. Selon vos besoins, utilisez :

  • TINYBLOB : avec une longueur maximale de 255 octets
  • BLOB : avec une longueur maximale de 65 535 octets
  • MEDIUMBLOB : avec une longueur maximale de 16 777 215 octets
  • LONGBLOB : avec une longueur maximale de 4 294 967 295 octets

Notez que si vous générez votre table à partir des annotations JPA, vous pouvez "contrôler" le type que MySQL utilisera en spécifiant l'attribut length de la Column, par exemple :

@Lob @Basic(fetch = FetchType.LAZY)
@Column(length=100000)
private byte[] picture;

En fonction de la longueur, vous obtiendrez :

       0 < length <=      255  -->  `TINYBLOB`
     255 < length <=    65535  -->  `BLOB`
   65535 < length <= 16777215  -->  `MEDIUMBLOB`
16777215 < length <=    2³¹-1  -->  `LONGBLOB`

3voto

Cyber Points 197

J'utilise ci-dessous et ça fonctionne pour les images

@Lob
@Column(name = "file", columnDefinition = "LONGBLOB")
private byte[] file;

2voto

kory Points 374

Dans notre cas, nous avons dû utiliser la syntaxe suivante:

public class CcpArchive
{
    ...
    private byte[] ccpImage;
    ...
    @Lob
    @Column(nullable = false, name = "CCP_IMAGE", columnDefinition="BINARY(500000)")
    public byte[] getCcpImage()
    {
        return ccpImage;
    }
    ...
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X