Большие объекты нельзя использовать в режиме автоматической фиксации. ⇐ 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(текст); } Проблема в том, что я не хочу сохранять какие-либо данные, поэтому не понимаю, почему их следует включать в транзакцию. Имеет ли смысл делать коммит, если я загрузил только некоторые данные из базы данных?
Спасибо.
У меня есть приложение 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(текст); } Проблема в том, что я не хочу сохранять какие-либо данные, поэтому не понимаю, почему их следует включать в транзакцию. Имеет ли смысл делать коммит, если я загрузил только некоторые данные из базы данных?
Спасибо.
Мобильная версия