ISIS: Проблемы со сбором вложений (Blob, Clob)

Я использую ISIS 1.16.2 для рабочего проекта и борюсь с вложениями и некоторыми связанными с этим проблемами. Я надеюсь, что вы можете мне помочь (по крайней мере, в части моих проблем).

Контекст: классы моих элементов должны хранить произвольное количество вложений (Blob и/или Clobs).

Из примера для одного вложения:

@Persistent(defaultFetchGroup = "false",
    columns = { @Column(name = "attachment_name"),
                @Column(name = "attachment_mimetype"),
                @Column(name = "attachment_bytes",
                    jdbcType = "BLOB",
                     sqlType = "LONGVARBINARY")
    })
@Column(allowsNull = "true")
private Blob attachment;

Первый подход для нескольких вложений:

@javax.jdo.annotations.Persistent(???)
@org.apache.isis.applib.annotation.Property(
        domainEvent = AttachmentDomainEvent.class,
        optionality = Optionality.OPTIONAL,
        hidden = Where.ALL_TABLES)
@org.apache.isis.applib.annotation.Collection
@lombok.Getter
private List<Blob> attachments = new LinkedList<>();
  1. Вопрос: Как мне аннотировать это поле, чтобы элементы этого списка хранились в автономной таблице, а не сериализовались в один столбец содержащего объекта? К сожалению, я еще не знаком с этими аннотациями для вложенных типов.
  2. Вопрос. Может ли ISIS одновременно обрабатывать несколько файлов? Например, как действие: @Action public void uploadFiles(List<Blob> files) {...}
  3. Вопрос. Возможно ли в ISIS 1.16.2 (или будущих версиях) хранить некоторую метаинформацию с записями Blob/Clob (например, размер, владелец и т. д.) в специальной таблице без потери возможности ISIS/Wicket, чтобы показать кнопку загрузки, предварительный просмотр и т. д. для пользовательского расширенного класса BLOB?

Может быть, немного не по теме, но связано с проблемой выше:

  1. Вопрос. Со свойством коллекции List<Blob> attachments; (см. выше) я получаю ??? EntityModel objectAdapter oid: null для каждого вложения в таблице, потому что классы Blob/Clob являются типами значений, а не ссылочными типами. Каков «правильный» способ предоставления необходимой информации для правильного отображения этих типов значений? (У меня такая же проблема с наборами enum)

Заранее спасибо!


person JND    schedule 30.01.2019    source источник
comment
Чтобы сохранить коллекцию непостоянного типа в таблице соединений, вам необходимо добавить @Join в соответствии с базовой документацией JDO datanucleus.org:15080/products/accessplatform_5_2/jdo/   -  person    schedule 30.01.2019


Ответы (1)


Ответ 1: невозможно сохранить List<Blob> как отдельное свойство. Вместо этого вам нужно определить объект, назвать его как-то вроде Document и позволить ему иметь один Blob. Затем вы можете получить List<Document>. Это может показаться дополнительной работой (я полагаю, что это так), но у вас, вероятно, в любом случае будут некоторые метаданные, которые вы хотите сохранить об этих Blob. По сути, Blob становится сущностью, а не значением.

Ответ 2: не поддерживается, см. предыдущий ответ.

Ответ 3: нет. Я думаю, можно было бы реализовать что-то подобное (я вижу, что в Wicket 7 есть виджет [1] для его поддержки), поэтому поднимите тикет на Apache Isis JIRA.

Ответ 4: это то, что вам позволит сделать такая сущность, как Document (согласно ответу 1). Вы по-прежнему можете предоставить действие загрузки, это будет обычное действие для Document... просто верните Blob в качестве возвращаемого типа действия, и оно будет загружено. Кроме того, если по какой-то причине эти большие двоичные объекты, которые вы сохраняете, являются PDF-файлами, проверьте средство просмотра pdfjs [2] на платформе incode.

person Dan Haywood    schedule 30.01.2019
comment
Спасибо за ваш быстрый и подробный ответ! В понедельник на работе попробую. - person JND; 01.02.2019
comment
Небольшое дополнение к этому ответу: я представил класс Document, предложенный Дэном, с дополнительными метаданными и предварительным просмотром для PDF-файлов (с pdfjs), обычного текста, файлов HTML и средства визуализации текста для просмотра файла. дерево ZIP-архива (каждое с использованием разметки и стилей HTML+CSS). Это решило проблемы 1, 3 и 4. Для вопроса 2 я реализовал своего рода обходной путь: пользователи могут загрузить заархивированный архив, а служба распаковывает документы. - person JND; 27.03.2019
comment
Спасибо за публикацию этого обновления. Звучит как довольно полезная реализация Document. Есть ли шанс, что вы могли бы поделиться им в той или иной форме, чтобы другие могли использовать его? - person Dan Haywood; 29.03.2019