Спящий режим: выведите столбец, содержащий двоичные данные, которые не должны загружаться

64
8

    Я работаю над приложением Spring-MVC и использую Hibernate в качестве инструмента ORM с PostgreSQL. В настоящее время я хотел бы сохранить некоторые файлы в базе данных. Для этого у меня есть класс Attachments, который имеет много-однозначное сопоставление с классом Notes.
      Теперь в классах Attachments у меня также есть имя файла, имя загрузчика и т.д., Которые я хотел бы отображать, но не за счет загрузки EAGER или получения объекта из базы данных, который бы перетащил приложение вместе с ним. Есть ли возможность исключить столбец двоичных данных, поэтому он не загружен. Вот код:

Модель прикреплений:

@Entity
@Table(name = "attachments")
public class Attachment {

@Id
@Column(name="attachid")
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "attach_gen")
@SequenceGenerator(name = "attach_gen",sequenceName = "attach_seq")
private int attachid;

@Column(name = "filename")
private String fileName;

@Column(name = "uploaddate")
private Timestamp fileUploadDate;

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

@ManyToOne
@JoinColumn(name = "noteid")
private Notes notedata;

public void setNotedata(Notes notedata){this.notedata=notedata;}

public Notes getNotedata(){return notedata;}
//Getters and setters ommitted
}

ПрикрепленияDAOImpl:

 @Override
public boolean addAttachment(byte[] bytes, String fileName, int noteid) {
session = this.sessionFactory.getCurrentSession();
try {
Attachment attachment = new Attachment();
attachment.setFileName(fileName);
attachment.setAttachment(bytes);
attachment.setFileUploadDate(new Timestamp(System.currentTimeMillis()));
Notes notes = (Notes)session.get(Notes.class,noteid);
notes.getAttachments().add(attachment);
attachment.setNotedata(notes);
session.save(notes);
session.flush();
return true;
} catch (HibernateException e){
e.printStackTrace();
return false;
}
}

Кроме того, если я сохраняю, например, PDF файл в базе данных, мне нужно выполнить некоторые дополнительные операции, чтобы правильно получить данные. Я имею в виду, когда я использовал для сохранения изображений, мне приходилось добавлять данные изображения с помощью "data: image/png; base64". Надеюсь, что-то вроде этого не требуется. Любая помощь будет приятной. Большое спасибо.

спросил(а) 2021-01-19T20:02:57+03:00 6 месяцев, 1 неделя назад
1
Решение
64

Один из

Ленивая загрузка поля

Добавьте в ваше поле аннотацию @Basic(fetch = FetchType.LAZY). Вам понадобится инструментарий байт-кода. См. Http://java.dzone.com/articles/hibernate-bytecode-enhancement для получения справки.

Сделайте поле своим классом и сделайте его одним. Тогда сделайте это ленивое

Возможно, вы сможете сделать одноразовое отношение к тому же классу? Тогда сделайте это ленивое

Для вашего второго вопроса вы должны сохранить contentType загруженного файла в своем db и записать его обратно при загрузке с помощью response.setHeader('Content-Type',...);

ответил(а) 2021-01-19T20:02:57+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема