JPA eclipselink OID Крупный объект PostgreSQL

Я новичок в JPA, у меня проблема с полями типов oid PostgreSQL (поле foto), я пытаюсь сохранить изображение, полученное из интерфейса, через p:fileupload Primefaces, и мне это не удалось. IDE Я сопоставил тип данных поля изображения BigInteger. Они пробовали следующее:

  • Я хотел преобразовать байт BigInteger FileUploadEvent, и ошибка меня поставила в тупик.

  • Подумав, что в IDE был неправильно сопоставлен OID, изменил тип данных на byte[] и стал байтом, вернул мне FileUploadEvent, и я выдал ошибку.

    [Предупреждение EL]: 12.01.2013 16:54:51.2 — ServerSession (1488263888) — Исключение [EclipseLink-3002] (Eclipse Persistence Services — 2.3.2.v20111125-r10461): org.eclipse.persistence. исключения . ConversionException Описание исключения: Объект [94,750] класса [class java.lang.Long] из сопоставления [org.eclipse.persistence.mappings.DirectToFieldMapping [photo -> candidato.foto]] с дескриптором [RelationalDescriptor (Entity.Candidato -> [DatabaseTable (кандидат)])], не удалось преобразовать в [класс [B].

Добавьте аннотацию @ Lob для двух предыдущих случаев, и это тоже не сработало, я не знаю, применяю ли я какое-либо предварительное преобразование или что-то в этом роде.

IDE: NetBeans 7.2

СУБД: PostgreSQL 9.0

Механизм сохраняемости: EclipseLink 2.3.2

Я надеюсь, что смогу помочь.

Таблица БД

CREATE TABLE candidato
    (
      idcandidato serial NOT NULL,
      idtipoidentificacion integer,
      numeroidentificacion character varying(100),
      nombres character varying(100),
      foto oid,
      n_foto character varying(50),
      CONSTRAINT candidato_pkey PRIMARY KEY (idcandidato),
    )
    WITH (
      OIDS=FALSE
    );

Entity Candidato с BigInteger (генератор Netbeans)

@Column(name = "foto")
private BigInteger foto;

public BigInteger getFoto() {
    return foto;
}

public void setFoto(BigInteger foto) {
    this.foto = foto;
}

Объект-кандидат с изменением типа (byte[])

@Column(name = "foto")
private byte[] foto;

public byte[] getFoto() {
    return foto;
}

public void setFoto(byte[] foto) {
    this.foto = foto;
}

person Gustavo Salgado    schedule 12.01.2013    source источник
comment
Не используйте oid для больших двоичных объектов. Используйте bytea.   -  person a_horse_with_no_name    schedule 13.01.2013
comment
a_horse_with_no_name, почему бы не использовать oid для BLOB-объектов? goo.gl/GQ81t   -  person Gustavo Salgado    schedule 13.01.2013
comment
Потому что OID — это просто указатель, и он очень специфичен для Postgres. Вряд ли какая-либо библиотека (кроме специфических для Postgres) обрабатывает их правильно. С другой стороны, bytea ведет себя как тип данных BLOB в большинстве (если не во всех) других СУБД, поэтому универсальные библиотеки (например, ORM) могут справиться с этим намного лучше. Кроме того, нет необходимости в ведении хозяйства с bytea (с oid вам нужно вручную удалить файл, на который они указывают). Если вам не нужно хранить файлы размером более 1 ГБ или вы всегда имеете доступ только к частям данных, bytea действительно лучший выбор.   -  person a_horse_with_no_name    schedule 13.01.2013
comment
Если вам нужно поместить их в базу данных, используйте bytea, но вам следует серьезно подумать о том, чтобы вообще не помещать их в БД. Просто сохраните имена файлов. Хотя их хранение в поле bytea в таблице гарантирует согласованность (что может избавить вас от нескольких головных болей), это сделает вашу базу данных и sql-дампы вашей базы данных огромными. Кроме того, это очень быстро становится узким местом при обслуживании изображений на веб-сайте, что означает, что вам все равно придется кэшировать их как обычные файлы на диске на веб-сервере.   -  person Eelke    schedule 13.01.2013


Ответы (2)


Кажется, это вызывает путаницу у пользователей спящего режима. В большинстве случаев вам нужен byte[] на стороне гибернации и bytea на стороне PostgreSQL. bytea означает «массив байтов», поэтому они более или менее идентичны. У байтов намного меньше накладных расходов, чем у лобов, но вы можете использовать lob (blob в hybernate и oid в PostgreSQL), если вам нужен потоковый интерфейс, включая возможность поиска в lob. Например, если вы храните потоковое видео и хотите начать новый сегментированный запрос размером 25 МБ, вам пригодятся большие объекты.

person Chris Travers    schedule 21.04.2013

Как Postgres возвращает тип OID? Скорее всего, вам нужно использовать конвертер для преобразования между типом Java и типом OID.

См. http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_converter.htm#CHDEHJEB

person James    schedule 22.04.2013