Большие объекты нельзя использовать в режиме автоматической фиксации.JAVA

Программисты JAVA общаются здесь
Ответить
Гость
 Большие объекты нельзя использовать в режиме автоматической фиксации.

Сообщение Гость »


У меня есть приложение Spring, которое использует Hibernate в базе данных PostgreSQL. Я пытаюсь хранить файлы в таблице базы данных. Кажется, он сохраняет строку вместе с файлом (я просто использую метод persist в EntityManager), но когда объект загружается из базы данных, я получаю следующее исключение:

org.postgresql.util.PSQLException: большие объекты нельзя использовать в режиме автоматической фиксации. Для загрузки данных я использую временный атрибут MultipartFile и в его установщике устанавливаю информацию, которую хочу сохранить (байт[], имя_файла, размер). Объект, который я сохраняю, выглядит следующим образом (остальные геттеры/сеттеры я опустил):

@Entity @Table(name="myobjects") общественный класс MyClass { @Идентификатор @GeneratedValue(strategy=GenerationType.SEQUENCE, генератор="последовательность") @SequenceGenerator(name="sequence",sequenceName="myobjects_pk_seq",locationSize=1) @Column(name="id") частный целочисленный идентификатор; @Лоб описание частной строки; @Temporal(TemporalType.TIMESTAMP) частная дата создания Дата; @Переходный частный MultipartFile multipartFile; @Лоб @Basic(fetch=FetchType.LAZY, необязательно=true) байтовый [] файл; Строковое имя файла; Строка fileContentType; Целочисленный размер файла; public void setMultipartFile (MultipartFile multipartFile) { this.multipartFile = multipartFile; пытаться { this.file = this.multipartFile.getBytes(); this.fileName = this.multipartFile.getOriginalFilename(); this.fileContentType = this.multipartFile.getContentType(); this.fileSize = ((Long) this.multipartFile.getSize()).intValue(); } catch (IOException e) { logger.error(e.getStackTrace()); } } } Я вижу, что когда он сохраняется, у меня есть данные в строке, но когда я вызываю этот метод, он терпит неудачу:

публичный список findByDescription(String text) { Запрос запроса = getEntityManager().createQuery("from MyClass WHERE UPPER(описание), например: запрос ORDER BY CreationDate DESC"); query.setParameter("query", "%" + text.toUpperCase() + "%"); вернуть запрос.getResultList(); } Этот метод дает сбой только в том случае, если в результате есть объекты с файлами. Я пытался установить в файл persistence.xml

но это не решает проблему.

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

Есть идеи?

Спасибо.

ОБНОВЛЕНИЕ

По ссылке, предоставленной Шекхаром, предлагается включить вызов в транзакцию, поэтому я установил вызов службы внутри транзакции, и он работает (я добавил аннотацию @Transactional).

@Transactional public List find(String text) { вернуть myClassDAO.findByDescription(текст); } Проблема в том, что я не хочу сохранять какие-либо данные, поэтому не понимаю, почему их следует включать в транзакцию. Имеет ли смысл делать коммит, если я загрузил только некоторые данные из базы данных?

Спасибо.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»