JPA, Mysql Blob возвращает данные слишком долго - PullRequest
53 голосов
/ 17 августа 2010

У меня есть несколько полей byte[] в моих сущностях, например:

@Entity
public class ServicePicture implements Serializable {
    private static final long serialVersionUID = 2877629751219730559L;
    // seam-gen attributes (you should probably edit these)
    @Id
    @GeneratedValue
    private Long id;
    private String description;

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

В моей схеме базы данных поле установлено на BLOB, так что это должно быть хорошо.В любом случае: каждый раз, когда я пытаюсь вставить изображение или pdf - ничего больше, чем 1mb, я получаю только это

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)

Я проверил свой MySQL cnf и для параметра max_allowed установлено значение 16M - я что-то упустил?

Ответы [ 2 ]

117 голосов
/ 18 августа 2010

Все зависит от типа столбца, используемого для столбца picture. В зависимости от ваших потребностей используйте:

  • TINYBLOB: максимальная длина 255 байт
  • BLOB: максимальная длина 65 535 байт
  • MEDIUMBLOB: максимальная длина 16 777 215 байт
  • LONGBLOB: максимальная длина 4 294 967 295 байт

Обратите внимание, что если вы генерируете свою таблицу из аннотаций JPA, вы можете "контролировать" тип, который MySQL будет использовать, указав атрибут length Column, например:

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

В зависимости от length вы получите:

       0 < length <=      255  -->  `TINYBLOB`
     255 < length <=    65535  -->  `BLOB`
   65535 < length <= 16777215  -->  `MEDIUMBLOB`
16777215 < length <=    2³¹-1  -->  `LONGBLOB`
1 голос
/ 02 апреля 2015

В нашем случае мы должны были использовать следующий синтаксис:

public class CcpArchive
{
    ...
    private byte[] ccpImage;
    ...
    @Lob
    @Column(nullable = false, name = "CCP_IMAGE", columnDefinition="BINARY(500000)")
    public byte[] getCcpImage()
    {
        return ccpImage;
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...